2012-03-09 62 views
5

应用程序可能具有在单独的线程上运行并在完成时回叫某个对象的部分。典型的模式可能如下所示:在Android上处理异步回调有什么好策略?

1)View或Fragment会调用某个模型。呼叫从某些查看或片段

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

2)模型使用一个线程或的AsyncTask,做事情起源,然后调用调用线程上的回调 - 通过处理器

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进行交互以通过某些控制逻辑推进

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

什么是一些很好的策略来处理这种情况?

回答

1

听起来好像你想要以更一致的方式处理模型和视图之间的通信。分离是个不错的方法是使用一个服务:

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

如果你的应用程序只在一个进程中运行,我会建议寻找到IntentService自其更易于使用。

这方面的一个很好的例子是谷歌IO 2011 IOSched应​​用:

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

似乎相当大,但建筑是经过深思熟虑的有关于分离的数据问题(无论是从本地或远程资源)。

让它在自己的服务中运行而不是在视图中绑定回调的第二个好处是服务不在活动的生命周期中,所以无需担心活动发生时的回调会发生什么销毁/暂停。当使用像这样的回调时,很多时候回调会被调用,并且活动可能还没有活动。

+0

谢谢斯蒂芬,我会看看2011年IOSched应​​用程序。一个服务似乎有些过分,因为看起来应该有一种方法可以安全地将消息发回到视图或片段。我一直在尝试使用post(...),但是我仍然了解它是如何在窗口不可见的情况下工作的,以及一般的Android模式。 – 2012-03-09 06:45:20

+0

这看起来好像过火了,但是当你使用这种回调模式时,你通常会做某种长时间运行的异步任务。由于调用和完成之间可能存在很大的时间差异,因此您需要开始担心时间会影响您的状态。在活动生命周期内工作时,这会变得更加麻烦,因为对活动的当前状态没有任何保证。 – 2012-03-09 12:40:49