0

在过去的几天里,我问过这个问题的变体。我不理解或建立正确的联系等,所以我真的很沮丧,不知道我应该走哪条路。

我开发了一个 XAMLX WCF 工作流服务,我的 Windows 客户端与之交互得很好。我是 android 和 java 的新手,因此基本上是 NOOB。我的服务使用 BasicHttpBinding 并期望请求中有几个字符串值(uid 和 pwd)。响应只是一个字符串。

现在在android上我完全迷路了。我已阅读使用 AsyncTask,听说它存在重大问题并使用 RoboSpice。看着 RoboSpice,它看起来非常稳固但学习曲线非常僵硬。我听说使用 LoopJ 的学习曲线比较僵硬,因为刚开始使用它会更容易。把那些希望你使用 JSON 的人扔进去,是的。我肯定迷路了。

所以我被拉向了很多不同的方向。我知道我需要它是异步的,这样它就不会锁定 ui 线程,我想获得一个可靠的强大解决方案,但现在,即使是同步地与服务进行交互,这也是令人鼓舞的一步。

这是我的基础知识: 向服务发送请求。让应用程序暂停/循环等。进度条会很棒,但现在一个不会挂起的简单循环就可以了。接收响应并继续处理。

这对我来说在 .NET 中非常简单,我认为它会很简单。只是表明骄傲是在堕落之前到来的。

TIA JB


直接问题

如前所述,我的 OP 中有几个隐含的问题。那是因为我不知道该问什么。所以现在让我们使用 AsynchTask。让我们称之为我的婴儿步。以下是我的问题: 如何关联值以填充请求?在 .NET 中,我将创建一个与请求所期望的匹配的对象。所以我的对象会有一个 UserName 属性和 Password 属性。我会给他们分配他们的值,比如 obj.UserName = "Joe"; 然后我会调用服务操作并将其传递给 obj。

如何确保我使用正确的库?我读过 AsyncTask 使用 Apache Http Client 库。好的,我用谷歌搜索得到罐子,显然它已经结束了。但仍然可用,所以我下载了最新版本并将其放在我的 lib 文件夹中......但我不必这样做,因为我可以在没有它的情况下导入 org.apache.http.HttpResponse 所以我当时使用哪个版本,我应该使用较旧的或最新的。

**最后我如何让应用程序暂停,因为此代码执行某些操作(尽管它从未显示在我的服务机器的日志中)并且当它停止执行某些操作时,我的代码继续执行并在到达它的点时崩溃需要来自服务的数据.....但它不存在。进度条是蜜蜂的膝盖。

这是我的实现代码:

public class AsyncHttpRequestManager extends AsyncTask<String, Boolean, String>
{
private static final String serviceUrl = "http://www.serviceurl.com/service.xamlx";

@Override
protected String doInBackground(String... params) 
{

    try 
    {
        DefaultHttpClient client = new DefaultHttpClient();
        HttpPut putRequest = new HttpPut(serviceUrl);
        putRequest.setHeader("Content-type", "text/plain");
        putRequest.setHeader("Accept", "text/plain");
            putRequest.setEntity(new StringEntity(params[0])); //This one is connected to my first question. How do I get the proper associations for the operations contract.
            HttpResponse response = client.execute(putRequest);
            InputStream content = response.getEntity().getContent();
        BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
        String result = "";
        String s = "";
        while ((s = buffer.readLine()) != null) 
        {
            result += s;
        }
        return result;

    }
    catch (UnsupportedEncodingException e) 
    {
        Log.e("AsyncOperationFailed", e.getMessage());
        e.printStackTrace();
    } catch (ClientProtocolException e) 
    {
        Log.e("AsyncOperationFailed", e.getMessage());
        e.printStackTrace();
    } catch (IOException e) 
    {
        Log.e("AsyncOperationFailed", e.getMessage());
        e.printStackTrace();
    }
    return null;

}

protected void onPostExecute(String result) 
{
    Log.d("MESSAGE", result);
}

}

我这样称呼它:

new AsyncHttpRequestManager().execute("joe","asdf");

如果需要更多信息,我很乐意发布。

4

1 回答 1

0

您应该一次问一个问题,即 SO 是如何设计和策划的,以使其发挥作用。

对于 HTTP 身份验证

http://developer.android.com/reference/org/apache/http/auth/UsernamePasswordCredentials.html

例如

HttpClient client = new HttpClient();
client.getParams().setAuthenticationPreemptive(true);
Credentials defaultcreds = new UsernamePasswordCredentials("username", "password");
client.getState().setCredentials(new AuthScope("myhost", 80, AuthScope.ANY_REALM), defaultcreds);

Asynctask 不需要任何外部库,它是 Android 平台的一部分。不要对 HTTPClient 和 Asynctask 感到困惑。Asyntask 是一个通用类,旨在在与主 UI 线程不同的线程上调用后台处理以避免阻塞。碰巧您正在考虑使用 Asynctask 来处理您的 Web 请求,但它们没有以任何方式链接。

您关于“如何将数据返回到我的应用程序”的问题最好单独提出,但本质上,您是按顺序思考的。您的应用不应暂停。有很多方法可以正确处理这个问题,进度对话框就是其中之一。

于 2013-01-01T20:50:22.257 回答