当Activity停止时更新内存中的对象

时间:2011-02-11 15:40:15

标签: android

只是好奇人们如何处理这种情况:

假设您创建Activity时启动AsyncTask或Thread以访问Web服务并检索一段数据。假设,在AsyncTask完成之前,用户已经点击了一些按钮,将它们发送到新的Activity。在新的Activity上,AsyncTask结束。

当AsyncTask完成时,您希望第一个Activity的成员变量更新,但该Activity现在已停止。

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

更新

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

2 个答案:

答案 0 :(得分:2)

  

据我所知,你不能安全   访问成员变量因为   Android本可以收回它。

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

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

最常见的情况是用户只需更改手机的方向。您的活动很可能会被销毁并重新创建。如果你有数据需要存活 - 你可能会这样做 - 然后实施onRetainNonConfigurationInstance()并从getLastNonConfigurationInstance()调用onCreate()来处理这个问题。 (显然,正在运行所有这些的AsyncTask应该知道更新后一个实例上的内容,而不是之前的实例。

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

答案 1 :(得分:0)

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

然后在您的活动onCreate中,您必须制作getIntent并检查其是否有结果,您还需要实施onNewIntent回调,以便在您的活动当前时通知您运行an接收与数据的Intent,你必须在此回调中调用getIntent