最佳的组织AsyncTask方式

3
我是一名相对新手的Android开发者,目前正在开发一个需要频繁调用RESTful web服务的应用程序。
我将每个调用都放在一个异步任务中,但在某些文件中,我有接近15个不同的异步任务。现在,我把它们全部作为私有类放在我的活动类中。如何更好地组织它们(例如将它们放在单独的文件中),同时仍然能够更新UI呢?我想通过将上下文传递到每个异步任务的构造函数中来实现,但我想知道是否有最佳实践/更好的方法。
谢谢!

2
你应该使用像Volley这样的库,而不是多个asynctask来处理你的网络请求。 - tbruyelle
我同意上面的伙伴所说,或者如果你想继续使用AsyncTasks,可以使用ThreadPool executor! - Pavlos
AsyncTasks可以在线程池执行器中执行。由于它是公共的,您也可以(滥用)它来做其他事情。 - zapl
3个回答

1
将Activity作为构造函数参数传递听起来对我来说是一个好计划。当你将它们声明为内部类时,基本上正在发生相同的事情。
但要记住,使用AsyncTasks加载数据会有一些缺点。一旦启动,即使活动已经关闭并且保留对您的活动的引用(因此无法进行垃圾回收),它们也将继续运行。
您可能需要了解其他概念,例如加载器。

1

不要为不同类型的异步任务使用太多类,我建议您使用这个库

您可以在这里查看

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秒钟来加载数据,就这样。 - Udit Kapahi

1
考虑使用库来简化你的代码库。我写了droidQuery,它可以用于简化AsyncTask等等。例如,要从example.com获取JSON数据,并在之后可以访问上下文,你可以这样做:
$.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"));

.context(this) 应该改为应用程序上下文。存储对活动上下文的引用是不好的,除非仅在活动生命周期内使用。异步操作往往会在此之后保留引用。 - zapl
2
@zapl,这个上下文对象并不是必需的,但更多的是一种方便。如果没有它,droidQuery参数将为null。 - Phil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接