2013-10-23 36 views

回答

1

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传递给construc TOR。 (我假设你写在你的构造函数上面显示的赋值语句。

2

是永远声明你Asynctask静态如果它是一个内部类,或者只是创建它自己的类,尽量避免声明非静态内部类,因为它创建内存泄漏。Read here for a more elaborate explanation why you should not do this

你不想使用WeakReference一个的AsyncTask因为Android 2.3以上版本的垃圾收集器是非常积极的,并会收集所有弱refrences非常快。而且弱引用通常不是线程的良好格局,其更多用于内存占用像重载像bitmaps(但不再像以前说的Android)

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

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

1

如果你使用WeakReference是出于正确的理由,那么拥有一个积极的垃圾回收器不应该打扰你。

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

例如,有一个AsyncTask通过ImageView加载图像到。

AsyncTask完成它的工作后,如果没有人指向带有强引用的图像视图,那意味着ImageView对用户不再可见并且它的视图已被销毁,那么为什么可能可能想要参考已经脱屏的视图。

所以是的,我相信AsyncTask中的所有引用都应该弱化,特别是与UI“Views,Activity”类似的东西。

是的,你应该有声明为static尽可能你的内部类,所以他们没有一个隐含参考其含有的类,它会破坏使用WeakReference

+0

难道不是我们试图做没有强有力的参照物的任何物体都可以被垃圾收集?如果你需要有一个强烈的参照asynctask没有自动garabage收集在一个薄弱的参考,doens't击败目的? WeakRef通常用于例如缓存,在那里可以得到null,因为你只是重新创建对象。如果asynctask为空,你必须重新创建整个任务,并且如果你保持强大的ref,那么在弱引用中没有意义,或者我错过了这一点? – for3st

+0

你完全误解了我所说的话,我没有说自己对AsyncTask有一个弱引用,我说对async任务内的对象有一个弱引用,那就是开始。 Seond,java中的线程一般由JVM保存和管理,所以如果你启动一个线程或一个asynctask,并且根本没有引用它,它仍然会在内存中,直到它完成它工作,那么我会被垃圾收集,但不会之前。 – elmorabea

+0

如果UI(活动)完成,将不会有强引用imageView - >它将被收集,无论是弱引用还是强引用,所以我没有在该简单引用中获得优势。它似乎只是增加了复杂性而没有任何收益。 – for3st

相关问题