处理程序内存泄漏

时间:2019-11-28 10:59:44

标签: android memory-leaks android-handler

几天前,我接受了采访。

我遇到了用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”运行,但立即销毁。 但是,由于使用了处理程序,因此无法从内存中释放活动。

面试结束后,我试图在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()”函数中删除处理程序的回调和消息。

enter image description here

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

为什么?

什么是完美的解决方案?

0 个答案:

没有答案