在Android上处理异步回调的好策略是什么?

时间:2012-03-09 00:35:26

标签: android

应用程序可能包含在不同线程上运行的部件,并在完成时回调某个对象。典型的模式可能如下所示:

1)View或Fragment调用某个模型。该呼叫来自某些视图或片段

model.doSomething(context, new Runnable() {
    public void run() { /* run on the main thread when model finishes */ }
});

2)模型使用Thread或AsyncTask执行某些操作,然后在调用线程上调用回调 - 使用Handler

void doSomething(Context context, Runnable callback) {
    Handler handler = new Handler();
    // ...
    // When finished (this is really done on some separate thread),
    handler.post(callback);
} 

3)回调与调用View或Fragment交互以推进某些控制逻辑

回调可能是触摸未附加到窗口的视图状态,这可能会导致应用程序不稳定。

处理这种情况有哪些好的策略?

1 个答案:

答案 0 :(得分:1)

听起来您希望以更一致的方式处理模型与View之间的通信。分离这些的一个好方法是使用服务:

http://developer.android.com/reference/android/app/Service.html

如果您的应用程序仅在单个进程中运行,我建议您查看IntentService,因为它更易于使用。

一个很好的例子是Google IO 2011 IOSched应​​用程序:

http://code.google.com/p/iosched/

看起来相当大,但在分离数据问题(来自本地或远程资源)方面,该架构经过深思熟虑。

让它在自己的服务中运行而不是在您的视图中绑定回调的第二个好处是该服务存在于活动的生命周期之外,因此您不必担心每当您的活动被销毁时您的回调会发生什么/暂停。很多时候,当使用这样的回调时,回调将被调用,活动可能仍然没有活着。