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