该Handler类应该是静态的,否则可能会发生内存泄漏。

5

我有一个非常简单的代码:

package com.example.conn08;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class MainActivity extends Activity
{
    private static CustomHandler mHandler;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        updateUI();
    }
    private class CustomHandler extends Handler
    {
        @Override  
        public void handleMessage(Message msg) 
        {  
            MainActivity.this.updateUI();  
        }  
        public void sleep(long delayMillis)
        {  
            this.removeMessages(0);  
            sendMessageDelayed(obtainMessage(0), delayMillis);  
        }  
    }
    private void updateUI()
    {
        mHandler.sleep(1000);
        Log.v("updateUI", "kokoko");
    }
}

But in

MainActivity.this.updateUI();

我看到了

这个Handler类应该是静态的,否则可能会导致内存泄漏(com.example.conn08.MainActivity.CustomHandler)

为什么?请帮忙解答


编辑后的代码:

package com.example.conn08;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class MainActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        updateUI();
    }
    static class CustomHandler extends Handler
    {
        WeakReference<MainActivity> mActivity;

        CustomHandler(MainActivity aFragment) 
        {
            mActivity = new WeakReference<MainActivity>(aFragment);
        }
        @Override
        public void handleMessage(Message message) 
        {
            MainActivity theActivity = mActivity.get();
            theActivity.this.updateUI();  
        }
    }
    private CustomHandler mHandler = new CustomHandler(this);

    private void updateUI()
    {
        //mHandler.sleep(1000);
        Log.v("updateUI", "kokoko");
    }

}

我已经按照这个例子进行了编辑:Android中的Handlers和内存泄漏,但现在出现了"theActivity cannot be resolved to a type"错误。

1
删除 theActivity.this,直接使用 theActivity。它是对 theActivity.this 的引用,因此重复了。 - tolgap
1个回答

0

更改:

theActivity.this.updateUI();  

到:

theActivity.updateUI();  

因为当你说theActivity时,就像在说this一样。


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