Android 在 Activity 中使用 Handler 为

2023-10-07  本文已影响0人  雁过留声_泪落无痕

示例代码

public class MyActivity extends Activity {  
    private Handler mHandler = new Handler() {  
        @Override  
        public void handleMessage(Message msg) {  
            // 处理消息  
        }  
    };  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        // 发送延迟消息  
        mHandler.sendEmptyMessageDelayed(1, 1000);  
    }  
  
    @Override  
    protected void onDestroy() {  
        super.onDestroy();  
        // 销毁Activity时,未移除消息和Handler的绑定关系  
    }  
}

根本原因

我们知道,Handler 对象需要有一个 Looper 对象,而 Looper 对象持有一个 MessageQueue 对象,我们通过 Handler 发送的消息都会存在 MessageQueue 对象当中。

而当我们构造一个 Handler 对象时,如果不显示指定 Looper 对象,则会使用 Looper.myLooper() 获取当前线程的 Looper 对象,像上面的代码,在 Activity 中构造了一个 Handler 对象,则默认使用的是 Looper.getMainLooper()。因此,通过 Handler 发送的消息都存在了和主线程(主线程是会一直存在的,死循环)绑定的 MessageQueue 对象中,如果有延迟消息,则会导致 Activity 得不到释放,最终导致内存泄漏。

上一篇下一篇

猜你喜欢

热点阅读