2011-02-11 77 views
1

只是好奇人们是如何处理这种情况:更新对象时,活动停止

让当你的活动创建你发动的AsyncTask或线程来打一个Web服务和检索数据块的说。假设在AsyncTask完成之前,用户已经点击了一些按钮,将它们发送给一个新的活动。在新的Activity上,AsyncTask完成。

当AsyncTask完成后,您需要更新第一个活动的成员变量,但该活动现在已停止。

你是做什么的?据我了解,你不能安全地访问成员变量,因为Android可以回收它。您可以使用BroadcastReceiver,但如果您不再使用该活动,无线电通信局将不会收到该消息。那么正确的答案是什么?

更新:

一种可能性是有任务写入到数据库,并在活动的的onResume从数据库中读取()。但是,就我而言,这是不合适的。我的活动中的数据不会被写入(读取:保存)到数据库,直到用户完成该活动并点击了“保存”按钮。

+0

也许使用保持状态的服务。您的第一个活动(如果正在运行)会定期查询服务的状态。 – 2011-02-11 15:51:34

回答

2

据我所知,你不能安全地访问 成员变量,因为 安卓可能已经回收了。

不,只要你有一个对象的引用(包括Activity实例),那么它仍然存在。您的第一个Activity在处于停止状态时仍然存在...您的AsyncTask可以更新UI元素或任何关联数据。

然而,当您的AsyncTask正在运行时,您的Activity可能会永久从您的任务中删除...也许这是您的想法?

最常见的情况是当用户只是改变手机的方向。您的活动很可能会被破坏并重新创建。如果您有需要存活的数据 - 这很可能是您执行的 - 然后执行onRetainNonConfigurationInstance()并从onCreate()拨打getLastNonConfigurationInstance()来处理此问题。 (显然你的AsyncTask这是所有这些应该知道更新的东西在后面的例子,而不是前一个)。

最后,如果您的AsyncTask确实更新了UI(看起来很可能),那么最好在UI对象上保留WeakReferences而不是直接引用。活动是昂贵的对象,并且只要某个东西保持对一个引用(并且每个View都包含对它拥有的Context/Activity的引用),它就不能被GC'd。这种方式非常容易泄漏记忆。

+0

目前,我的AsyncTask更新一个成员变量,然后调用一个Runnable来执行一个方法,该方法在TextView中显示该成员变量的内容。你能否给我提供一个正确实现onRetainNonConfigurationInstance()的示例的链接来帮助我们仔细考虑它? – Andrew 2011-02-11 16:42:07

0

您可以使用Intents将结果发送给启动AsyncTask的活动(您可以在onPostExecute方法中执行此操作),操作系统会将其放在前面或在停止时重新启动它。

然后在你的活动onCreate你必须做出一个getIntent并检查是否有结果,还需要实现onNewIntent回调,所以你被告知,如果你的活动当前正在运行的接收与数据的意图,你有在此回调中也呼叫getIntent