我是一个相对较新的Android开发人员,现在正在开发一个应用程序,它会调用RESTful Web服务。
我正在asyncTask
中进行每次调用,但在某些文件中,我接近的不同异步任务的数量为15.现在我将它们全部作为我的activity类中的私有类。如何更好地组织它们(即将它们放在单独的文件中),同时仍然能够更新UI ..我正在考虑将context
传递给每个asyncTask
的构造函数但我只是想知道如果有最佳实践/更好的方式。
谢谢!
答案 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"));