Android Asyntask:使用弱引用来避免设备旋转屏幕。

36
在《Apress Pro Android 4》中,作者说道:当设备旋转时,当前运行活动的上下文将不再有效。一种方法是使用对活动的弱引用,而不是硬引用。但作者只是提出了这个建议,并没有说明如何实现。请有经验的人给我一个示例。
3个回答

90

在你的 AsyncTask 中,你需要将你的活动(activity)作为参数传递进去。然后你会保存一个弱引用(weak reference)来引用它。这样你就可以在 onPostExecute 方法中解除引用并再次使用它。

类成员:

WeakReference<Activity> weakActivity;

AsyncTask中的某个地方,可能是构造函数或onPreExecute方法:

weakActivity = new WeakReference<Activity>(activity);

onPostExecute中:

Activity activity = weakActivity.get();
if (activity != null) {
   // do your stuff with activity here
}

2
如果垃圾回收没有及时启动,activity仍将是无效引用。如果我错了,请纠正我。 - q126y
1
这样做能避免内存泄漏吗? - Mahdi-Malv
如果语言级别设置为Java 8,则对象定义中的<Activity>不是必需的。 - Peter Chaula
WeakReference有一个叫做isEnqueued的属性(我想是这个名字),你可以用它来判断被引用的对象是否已经被加入垃圾回收队列。如果是,那么你可以认为该对象已经无效了。 - Leo

4

这里有一个使用弱引用(WeakReference)存储上下文的例子:

WeakReference<Context> cReference = new WeakReference<Context>(getApplicationContext());

现在我们可以使用这个弱引用来处理与Activity/Context相关的工作。

5
将应用程序上下文存储在WeakReference中是毫无意义的。应用程序上下文与应用程序同生命周期,并且永远不会被取消引用。 - JensV

1

如果你想恢复之前的活动,为什么不使用 onSaveInstanceState 并在以后恢复它呢。

查看此链接以获取更多详细信息

保存应用程序状态


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接