1

我需要一个小手握住从 C# 到 Java / Android 的转换,让客户端当然可以异步使用 Web 服务,这样它就不会锁定 gui....(进度条会锦上添花。)在 C#我会在客户端创建对象做这样的事情。

创建服务引用。创建与服务接口成员匹配的对象并进行填充。在单独的线程中启动在第二步中创建的服务请求传递对象。等待显示进度条。处理错误或返回数据的响应。

现在也许我太简单了,但我认为在 Java 中它会非常接近这种方法。我看到的是很多人说要扩展 AsyncTask 类。我缺少的是如何从客户那里传递我的价值观?例如,我如何发送用户名和密码?恐怕所有不同的文章和细微差别都让我感到困惑。我只需要一种直接的方式来完成工作。

因此,我将不胜感激任何提示、指针、教程或其他此类阅读。

JB

4

3 回答 3

1

异步任务带来了很多问题,因为它们托管的活动可能在执行仍在进行时被破坏。

最好的方法是将请求托管在意图服务或服务内部,这将在请求活动中继续存在。

如果您想要一个开箱即用的解决方案,我建议您看一下robospice库,这是一个非常成熟的项目。它基于Google Io 2010 演讲

于 2012-12-30T13:44:18.100 回答
1
public class AsyncHttpRequestManager extends AsyncTask<String, Boolean, String> {
    private final String serviceUrl = "URL HERE";
    String user;  
    String pass;

    public AsyncHttpRequestManager(String user, String Pass){
        this.user = user;  
        this.pass = pass;
    }

    @Override
    protected String doInBackground(String... params) {
        //execute the post
        return "";
    }

    protected void onPostExecute(String result) {
        Log.d("MESSAGE", result);
        //update the UI with the results
    }
}

然后您使用

new AsyncHttpRequestManager(user, pass).execute();
于 2012-12-30T13:51:47.637 回答
0

6 个月前,我开始使用 C#/.NET 进行 Android 开发

我们目前使用的第一个选项是AsyncTask来执行异步任务......在这种情况下它正在使用 Web 服务......

示例代码是

public class AsyncHttpRequestManager extends AsyncTask<String, Boolean, String> {
    private final String serviceUrl = "URL HERE";

    @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]));
            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);
    }
}

我为此写了一篇博文。

此外,为了显示进度/加载对话框,您可能必须覆盖 AsyncTask 中的 onPreExecute 和 onPostExecute 方法。检查文档。

第二种选择是使用loopj 库,它是一个基于异步回调的 Android Http 客户端,构建在 Apache 的 HttpClient 库之上。

利用 loopj 的示例代码是

AsyncHttpClient client = new AsyncHttpClient();
client.setBasicAuth("username","password/token");
client.get("http://www.example.com", new AsyncHttpResponseHandler() {
    @Override
    public void onSuccess(String response) {
        System.out.println(response);
    }
});

随着时间的推移,我们已经在 HttpClient 上创建了我们的助手,因此我建议您使用诸如 loopj 之类的开源库,它可以真正帮助您快速爬上初始步骤。唯一的挑战是,当您来自另一个平台时,您可能会面临使用其他库而不是简单的 AsyncTask 的初始挑战,但如果您有灵活性,那么值得花时间。

于 2012-12-30T13:29:24.283 回答