android - 这个 Handler 类应该是静态的,否则可能会发生泄漏

标签 android warnings handler

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

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");
    }
}

但是在

MainActivity.this.updateUI();

我明白了

This Handler class should be static or leaks might occur (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");
    }

}

我已经像这里的例子一样编辑了它 Handlers and memory leaks in Android ,但现在我有“theActivity cannot be resolved to a type”

最佳答案

改变:

theActivity.this.updateUI();  

到:

theActivity.updateUI();  

因为当你说 theActivity 时,就像在说这个。

关于android - 这个 Handler 类应该是静态的,否则可能会发生泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13321904/

相关文章:

java - Android ListView 包含 Activity 和非 Activity 条目

android - 调用 consumeAsync

java - 在 ListView 中为我自己的类创建一个 ArrayAdapter

javascript - 将 HTML 表格点击事件与 Javascript 关联

c - 信号处理函数前 3 次捕获 SIGKILL

javascript - 关于 .Sortable() 中的句柄

java - 如何验证 ipv4 ipv6 和 dns 名称?

C 指针和数组 : [Warning] assignment makes pointer from integer without a cast

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

objective-c - 如何忽略 "No visible @interface for X declares the selector"?