}
return mInstance;
}
public void dealData() {
}
}
2.))Handler造成的内存泄漏造成的内存泄漏
早些年Handler的使用频率还是蛮高的,它是工作线程与UI线程之间通讯的桥梁,只是现在大量开源框架对其进行了封装,我
们这里模拟一种常见使用方式来模拟内存泄漏情形。
public class MainActivity extends AppCompatActivity {
private Handler mHandler = new Handler();
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.text);//模拟内存泄露
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mTextView.setText("lcj");
}
}, 3 * 60 * 1000);
finish();
}
@Override
protected void onDestroy() {
super.onDestroy();
LApplication.getRefWatcher().watch(this);
}
}
上述代码通过内部类的方式创建mHandler对象,此时mHandler会隐式地持有一个外部类对象引用这里就是MainActivity,当执
行postDelayed方法时,该方法会将你的Handler装入一个Message,并把这条Message推到MessageQueue
中,MessageQueue是在一个Looper线程中不断轮询处理消息,那么当这个Activity退出时消息队列中还有未处理的消息或者
正在处理消息,而消息队列中的Message持有mHandler实例的引用,mHandler又持有Activity的引用,所以导致该Activity的
内存资源无法及时回收,引发内存泄漏。
LeakCanary检测结果如下:检测结果如下: