内存泄漏是 Android 开发中经常出现的错误。由于我们发送的消息会在 Handler 的 Looper 中不断轮循处理,这样 Handler 的声明周期比 Activity 会更长。所以在使用 Handler 时我们应该将其设为静态内部类,这样可以避免他的实例在 Activity 退出后还持有外部 Activity 的引用导致内存泄漏。还有在 Handler 的中使用外部成员变量是应该尽量使用弱引用,在 Activity 的 destroy 方法中清空消息这样也能减少内存泄漏的可能。下面展示下示例代码:
public class MainActivity extends AppCompatActivity {
private MyHandler mHandler = new MyHandler(this);
private TextView mTextView ;
private static class MyHandler extends Handler {//将Handler声明成静态内部类
private WeakReference<context> reference;//引用外部变量使用弱引用
public MyHandler(Context context) {
reference = new WeakReference<>(context);
}
@Override
public void handleMessage(Message msg) {
MainActivity activity = (MainActivity) reference.get();
if(activity != null){
activity.mTextView.setText("");
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView)findViewById(R.id.textview);
loadData();
}
private void loadData() {
//...request
Message message = Message.obtain();
mHandler.sendMessage(message);
}
@Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacksAndMessages(null);//清空 Handler 的消息操作
}
}