Handler咱们常常用在程序中,发送消息,然而这里涉及到内存泄漏隐患,非静态内部类引发的。java
非静态内部类引发内存泄漏,详见http://blog.csdn.net/qq_29266921/article/details/54847402安全
举个栗子:ide
public class MainActivity extends AppCompatActivity { 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); loadData(); } private void loadData(){ //...request Message message = Message.obtain(); mHandler.sendMessage(message); } }
上面的代码能够更加安全,修改以下:this
public class MainActivity extends AppCompatActivity { private MyHandler mHandler = new MyHandler(this); private TextView mTextView ; private static class MyHandler extends 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); } }
2.mHandler.removeCallbacksAndMessages(null)移除消息队列中全部消息和全部的Runnable。固然也能够使用mHandler.removeCallbacks()或mHandler.removeMessages()来移除指定的Runnable和Messagespa