我是一位相对较新的Android开发人员,现在正在致力于一个应用程序,该应用程序会对RESTful Web服务进行大量调用。组织AsyncTask的最佳方式
我在拨打asyncTask
,但在某些文件中,我有不同的异步任务的数量有15个。现在我把它们全部作为我的活动类中的私有类。我怎样才能更好地组织它们(即把它们放在单独的文件中),同时仍然能够更新用户界面..我想通过context
到每个asyncTask
的构造函数,但我只是想知道是否有最佳做法/更好办法。
谢谢!
我是一位相对较新的Android开发人员,现在正在致力于一个应用程序,该应用程序会对RESTful Web服务进行大量调用。组织AsyncTask的最佳方式
我在拨打asyncTask
,但在某些文件中,我有不同的异步任务的数量有15个。现在我把它们全部作为我的活动类中的私有类。我怎样才能更好地组织它们(即把它们放在单独的文件中),同时仍然能够更新用户界面..我想通过context
到每个asyncTask
的构造函数,但我只是想知道是否有最佳做法/更好办法。
谢谢!
而不是使用这么多类不同类型的AsyncTask的,我建议你使用这个库
,你可以看看这里
http://loopj.com/android-async-http/
你的代码会变得非常非常少的,而不是声明,可能的AsyncTask seperately写批量的代码,你可以只用4行代码
AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
@Override
public void onSuccess(String response) {
System.out.println(response);
}
});
我非常高效地快速响应响应。
我希望这会帮助你。 :)
iI正在寻找什么。谢谢! –
欢呼:) - 只要看到性能2秒即可加载数据。 –
作为构造函数参数传递给Activity听起来像是一个很好的计划。基本上,当你将它们声明为内部类时也是如此。
但请记住,使用AsyncTasks加载数据有一些缺点。一旦开始,即使活动已关闭并持有对活动的引用(因此不能垃圾回收),它们仍会继续运行。
你可能想看看其他概念,如装载机。
考虑使用库来简化您的代码库。我写了droidQuery,其中,可以用来简化AsyncTask
s。例如,从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"));
你应该为您的网络请求使用像Volley这样的库,而不是多个asynctasks。 – tbruyelle
我同意上面的伴侣,或者如果你想坚持AsyncTasks使用ThreadPool执行程序! – Pavlos
AsyncTasks可以在[线程池执行程序](http://developer.android.com/reference/android/os/AsyncTask.html#THREAD_POOL_EXECUTOR)中执行。既然它是公开的,你可以(ab)将它用于其他事情。 – zapl