Android - 我必须为内部类 AsyncTask 提供 WeakReference 吗?



假设我在活动类中有一个内部类AsyncTask。我必须在这个异步任务中具有弱引用吗?

另外,我必须一直对AsyncTask有弱引用吗?

最后,如果我将内部类 AsyncTask 声明为静态,它是否安全?

是的,如果Asynctask是内部类,请始终将其声明为静态,或者只是创建自己的类,请尝试避免声明为非静态内部类,因为它会产生内存泄漏。阅读此处以获取更详细的解释,为什么您不应该这样做

您不想将WeakReference用于异步任务,因为android 2.3 +的垃圾收集器非常激进,并且会非常快速地收集所有弱引用。此外,弱引用通常对于线程来说不是一个好的模式,它更适合像位图这样的内存占用量大的内容(但在 android 中不再像以前说过的那样)。

从 http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

从Android 2.3(API级别9)开始,垃圾回收器在收集软/弱引用方面更加积极,这使得它们相当无效。

WeakReference允许对Activity进行垃圾回收,因此您没有内存泄漏。

空引用意味着AsyncTask不能盲目地尝试更新不再附加的用户界面,这将引发异常(例如,视图未附加到窗口管理器)。当然,您必须检查空以避免 NPE。因此,使用WeakReference来处理上述情况是一种很好的做法。是的,将内部类声明为 static 是完全安全的

WeakReference<Activity> weakActivity;

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

weakActivity = new WeakReference<Activity>(activity);

onPostExecute

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

从启动AsyncTask的活动,将this传递给构造函数。(我假设您在构造函数中编写上面显示的赋值语句。

如果您出于

正确的原因使用 WeakReference,那么拥有一个激进的垃圾收集器不应该打扰您。

WeakReference意味着如果没有其他人强烈指向该对象,您对将该对象保留在内存中不感兴趣。

例如,具有传递ImageView以将图像加载到的AsyncTask

AsyncTask完成后,如果没有人指向具有强引用的图像视图,这意味着ImageView不再对用户可见,并且它的视图已被销毁,所以为什么你可能想要引用已从屏幕上删除的视图。

所以是的,我相信您在AsyncTask中的所有引用都应该是弱的,特别是与 UI"视图、活动"之类的东西相关的引用。

是的,您应该尽可能static地声明内部类,这样它们就不会隐式引用其包含类,这将破坏我们尝试使用WeakReference

相关内容

  • 没有找到相关文章

最新更新