组织AsyncTask的最佳方式

时间:2013-08-21 16:02:24

标签: java android rest android-asynctask

我是一个相对较新的Android开发人员,现在正在开发一个应用程序,它会调用RESTful Web服务。

我正在asyncTask中进行每次调用,但在某些文件中,我接近的不同异步任务的数量为15.现在我将它们全部作为我的activity类中的私有类。如何更好地组织它们(即将它们放在单独的文件中),同时仍然能够更新UI ..我正在考虑将context传递给每个asyncTask的构造函数但我只是想知道如果有最佳实践/更好的方式。

谢谢!

3 个答案:

答案 0 :(得分:1)

将Activity作为构造函数参数传递给我听起来像个好计划。当你将它们声明为内部类时,基本上会发生同样的情况。

但请记住,使用AsyncTasks加载数据有一些缺点。一旦启动,它们将继续运行,即使活动已经关闭并持有对您的活动的引用(因此它不能被垃圾收集)。

您可能需要查看其他概念,例如加载器。

答案 1 :(得分:1)

我建议您使用此库

,而不是为不同类型的asynctask使用这么多类

你可以看看这里

http://loopj.com/android-async-http/

你的代码将变得非常少,而不是声明可能asynctask单独编写大量代码,你可以只使用4行代码

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

我非常有效地快速确定响应。

我希望这会帮助你。 :)

答案 2 :(得分:1)

考虑使用库来简化代码库。我写了droidQuery,除其他外,它可以用来简化AsyncTask。例如,要从JSON获取example.com数据,并在之后访问上下文,您可以执行以下操作:

$.ajax(new AjaxOptions().url("http://www.example.com")
                        .context(this)
                        .type("GET")
                        .dataType("json")
                        .success(new Function() {
                            @Override
                            public void invoke($ droidQuery, Object... params) {
                                JSONObject json = (JSONObject) params[0];
                                Context context = droidQuery.context();
                                //TODO:
                            }
                        })
                        .error(new Function() {
                            @Override
                            public void invoke($ droidQuery, Object... params) {
                                AjaxError error = (AjaxError) params[0];
                                Log.e("Ajax", "Error " + error.status + ": " + error.reason);
                            }
                        }));

对于您经常调用的许多不同请求,您还可以创建AjaxOptions的实例供以后使用,它们具有不同的URL,类型,数据类型等:

Map<String, AjaxOptions> requests = new HashMap<String, AjaxOptions>();
//add the example above:
requests.put("example", new AjaxOptions().url("http://www.example.com")
                                         .context(this)
                                         .type("GET")
                                         .dataType("json")
                                         .success(new Function() {
                                             @Override
                                             public void invoke($ droidQuery, Object... params) {
                                                 JSONObject json = (JSONObject) params[0];
                                                 Context context = droidQuery.context();
                                                 //TODO:
                                             }
                                         })
                                         .error(new Function() {
                                             @Override
                                             public void invoke($ droidQuery, Object... params) {
                                                 AjaxError error = (AjaxError) params[0];
                                                 Log.e("Ajax", "Error " + error.status + ": " + error.reason);
                                             }
                                         }));

然后,只需通过调用:

执行此任务
$.ajax(requests.get("example"));