不仅使用postDelayed()方法会导致Android handler泄露,还有其他情况也会发生泄露。在使用handler时,必须注意以下几点:
1.避免使用匿名内部类来实现Handler,因为它会持有外部类的引用,导致内存泄露。
2.通过HandlerThread创建的handler对象需要在页面销毁时及时释放,避免handler引用Activity,导致内存泄露。
3.避免在Activity中创建静态Handler,因为静态变量生命周期与应用程序相同,当Activity被关闭后,Handler仍然存在,会导致内存泄露。
下面是一个避免Android handler泄露的示例:
public class MyActivity extends AppCompatActivity {
private final Handler mHandler = new Handler();
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
// do something
mHandler.postDelayed(this, 1000);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
mHandler.postDelayed(mRunnable, 1000);
}
@Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacksAndMessages(null);
}
}
在这个示例中,我们在Activity的onDestroy()方法中及时地移除了Runnable,避免了handler引用Activity,导致内存泄露的问题。