只是好奇人们如何处理这种情况:
假设您创建Activity时启动AsyncTask或Thread以访问Web服务并检索一段数据。假设,在AsyncTask完成之前,用户已经点击了一些按钮,将它们发送到新的Activity。在新的Activity上,AsyncTask结束。
当AsyncTask完成时,您希望第一个Activity的成员变量更新,但该Activity现在已停止。
你做什么的?据我了解,您无法安全地访问成员变量,因为Android可能已经回收它。您可以使用BroadcastReceiver,但如果您不再使用该活动,BR将不会收到该消息。那么正确的答案是什么?
更新
可能是将任务写入数据库并从Activity的onResume()中的该数据库中读取。但是,在我的情况下,这是不合适的。我的活动中的数据不会被写入(读取:保存)到数据库,直到用户完成该活动并点击了“保存”按钮。
答案 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
。