我正在尝试组织我的应用程序代码,将AsyncTask类与Activity或Fragments分开。 浏览此论坛我已经了解了“界面和监听器”解决方案:
Interface.java
public interface TaskCompleteListener<T> {
public void onTaskComplete(T result);
}
AsyncTask.java
[...]
@Override
protected void onPostExecute(String JSONResponse) {
// using Gson library I convert JSONResponse string to POJO objects...
listener.onTaskComplete(result);
}
Activity.java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// start AsyncTask...
}
// Inner class implementing interface
public class LoadTaskCompleteListener implements TaskCompleteListener<Object> {
@Override
public void onTaskComplete(Object result) {
updateUI(result);
}
}
public void updateUI(Object result) {
// here you can manage UI updating, using result object
}
}
UPDATE 的 DataHelper.java
public class DataHelper {
private AsyncTaskCompleteListener<Object> listener;
public DataHelper(AsyncTaskCompleteListener<Obejct> listener) {
this.listener = listener;
}
// Multiple AsyncTask are defined here...
}
嗯,我非常喜欢这种模式,但是:如果内部活动(或片段)怎么办? 我有多个请求,具有不同类型的结果(单个对象,数组,列表) 和管理它们的不同业务逻辑? 我无法使用单个回调处理。有任何想法吗?我应该添加多个 界面内的回调?我真的很困惑。 我有一个名为DataHelper的文件,里面有多个AsyncTask(比如web getters)。 当然,如果你提出任何其他选择,我可以放弃这种方法。
答案 0 :(得分:1)
为什么不返回一个Object数组呢?然后,如果你在该数组中有多个对象,你就会知道它们的放置顺序,这样你就可以一次使用多组结果。
public interface TaskCompleteListener<T> {
public void onTaskComplete(T... results);
}
答案 1 :(得分:1)
请注意,可以使用“处理程序”而不是异步任务,并且每个处理程序可以将其消息返回到消息循环器,其中msg包含不同的数据。易于处理许多数据类型,因为它只是一个消息组件。 样本here
请参阅'process_entity()',其中包含结果组件的消息由示例代码发送。
答案 2 :(得分:0)
请注意,onTaskComplete()
的定义接受通用类型作为参数,类型为T
:
onTaskComplete(T result);
这意味着您可以传入任何对象类型,单个对象,数组,列表等。
关于如何使用单个回调处理不同的结果,您可以使用Bundle
将结果放入,与密钥关联,然后在updateUI()
中检查该密钥并采取适当的措施动作。
像这样(伪代码,不确定它是否会编译):
@Override
protected void onPostExecute(String JSONResponse) {
Bundle bundle = new Bundle();
bundle.putString("key_json_response", result); //put the response in a Bundle
listener.onTaskComplete(bundle);
}
// .....
public void updateUI(Object result) {
Bundle bundle = (Bundle)result;
if(bundle.containsKey("key_json_response")){
String json = bundle.getString("key_json_response");
// process json
} else if(bundle.containsKey("key_another_response")){
// process another response
}
}