Android Handler,内存泄漏?

时间:2013-03-26 05:58:12

标签: android multithreading memory handler memory-leaks

我知道Handler可能会在Android中泄漏内存,但我不太确定我所做的是正确的:

public class MyActivity extends Activity
{

Handler handler;
HashMap<String, String> bigData = new HashMap<String, String>();

protected void onCreate(undle savedInstanceState) {
    super.onCreate(savedInstanceState);
    handler = new WeakHandler(){
        public void handlerMessage(Message msg, Context conetxt)
        {
           // i think this usage is wrong, still leak, am I right?
           Log.v("MyActivity", bigData.get("abc"))
        }
    }
};


static class WeakHandler extends Handler {

    private final WeakReference<Context> ref;

    public WeakHandler(Context t) {
        super();
        ref = new WeakReference<Context>(t);
    }

    @Override
    public final void handleMessage(Message msg) {
        final Context context = ref.get();
        if (context != null) {
            handleMessage(msg, context);
        }
    }

    public void handlerMessage(Message msg, Context conetxt)
    {

    }

 }

另外,如果我只想使用Handler来“post”,“postDelayed”,“removeCallbacks”,我不关心handleMessage,只是创建一个新的Handler实例来做到这一点是安全的,如下所示:

new Handler().postDelayed(some Runnable);

2 个答案:

答案 0 :(得分:1)

当你实例化WeakHandler时,它不是一个真正的WeakHandler类,而是一个扩展WeakHandler类的Anonymous类。 Anonymous类永远不会是静态的,因此除了显式的WeakReference之外,它还将包含对包含类(即MyActivity)的隐式引用。

由于onCreate()在主线程上运行,因此在onCreate()内创建的Handler将与主脚步(实际上是Application启动时创建的主Looper)相关联。如果您向Handler发布一条消息(或一个Runnable,因为Runnable将被一条消息包裹),那么Message / Runnable将引用一个Handler。

所以给你post延迟5分钟的东西。在销毁Activity之后(例如由于旋转),主Looper将引用Message / Runnable,Message / Runnable将引用Handler,Handler将引用Activity 5分钟。这是一个泄漏。

是的,“Log.v(”MyActivity“,bigData.get(”abc“))”行也会泄漏活动。

答案 1 :(得分:0)

使用MAT Analyzer检查内存泄漏。 http://www.youtube.com/watch?v=_CruQY55HOk。 谈话是关于内存泄漏。

我的猜测是对上下文的引用导致泄漏。使用getApplicationContext();

只要您的应用程序处于活动状态,此上下文就会存在。

http://android-developers.blogspot.in/2009/01/avoiding-memory-leaks.html