繁体   English   中英

处理程序内存泄漏

[英]Handler memory leak

几天前,我接受了一次采访。

我遇到了用A4纸编写的代码,我注意到这与内存泄漏问题有关。 但我无法回答如何解决。

代码在这里:

public class LeakJavaActivity extends AppCompatActivity {

    private String TAG = LeakActivity.class.getSimpleName();

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Log.d(TAG, "[MemoryLeak] handleMessage");
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_leak_java);

        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Log.d(TAG, "[MemoryLeak] run!!!");
            }
        }, 6_000);
        finish();
    }
}

“ LeakJavaActivity”运行,但立即销毁。 但是,由于使用了Handler,因此Activity无法从内存中释放出来。

面试后,我尝试用Google搜索解决方案,然后找到了。 但是,当我运行代码时,仍然存在内存泄漏。

public class LeakJavaActivity extends AppCompatActivity {

    private String TAG = LeakActivity.class.getSimpleName();

    private final static Handler handler = new NonLeakHandler();
    private final static Runnable runnable = new NonLeakRunnable();

    private final static class NonLeakHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Log.d("NonLeakHandler", "[MemoryLeak] handleMessage");
        }
    }

    private final static class NonLeakRunnable implements Runnable {

        @Override
        public void run() {
            Log.d("NonLeakRunnable", "[MemoryLeak] run");
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_leak_java);

        handler.postDelayed(runnable, 6_000);
        finish();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "[MemoryLeak] onDestroy");
        handler.removeCallbacksAndMessages(null);
    }
}

解决方案建议使用“静态类”。 然后在“ onDestroy()”函数中删除处理程序的回调和消息。

在此处输入图片说明

当我检查“事件探查器”时,有时活动仍然存在。

为什么?

完美的解决方案是什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM