View aicButton = findViewById(R.id.at_button); aicButton.setOnClickListener(newView.OnClickListener() { OverridepublicvoidonClick(View v){ startAsyncTask(); nextActivity(); } });
Memory Leak 4 – AsyncTask Handler
同样道理,定义匿名的Runnable,用匿名类Handler执行。Runnable内部类会持有外部类的隐式引用,被传递到Handler的消息队列MessageQueue中,在Message消息没有被处理之前,Activity实例不会被销毁了,于是导致内存泄漏。
voidcreateHandler(){ newHandler() {
OverridepublicvoidhandleMessage(Message message){ super.handleMessage(message); }
}.postDelayed(new Runnable() { Overridepublicvoidrun(){ while(true);
}
}, Long.MAX_VALUE >> 1); }
View hButton = findViewById(R.id.h_button); hButton.setOnClickListener(newView.OnClickListener() { OverridepublicvoidonClick(View v){ createHandler(); nextActivity(); } });
Memory Leak 5 – Handler Threads
我们再次通过Thread和TimerTask来展现内存泄漏。
voidspawnThread(){ newThread() {
Overridepublicvoidrun(){ while(true);
} }.start(); }
View tButton = findViewById(R.id.t_button); tButton.setOnClickListener(newView.OnClickListener() { OverridepublicvoidonClick(View v){ spawnThread(); nextActivity(); } });
Memory Leak 6 – Thread TimerTask
只要是匿名类的实例,不管是不是在工作线程,都会持有Activity的引用,导致内存泄漏。
voidscheduleTimer(){
newTimer().schedule(newTimerTask() { Override publicvoidrun(){
while(true); }
}, Long.MAX_VALUE >> 1); }
View ttButton = findViewById(R.id.tt_button); ttButton.setOnClickListener(newView.OnClickListener() { OverridepublicvoidonClick(View v){ scheduleTimer(); nextActivity(); } });
Memory Leak 7 – TimerTask Sensor Manager
最后,通过Context.getSystemService(int name)可以获取系统服务。这些服务工作在各自的进程中,帮助应用处理后台任务,处理硬件交互。如果需要使用这些服务,可以注册监听器,这会导致服务持有了Context的引用,如果在Activity销毁的时候没有注销这些监听器,会导致内存泄漏。
voidregisterListener(){
SensorManagersensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor sensor =
sensorManager.getDefaultSensor(Sensor.TYPE_ALL); sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_FASTEST); }
View smButton = findViewById(R.id.sm_button); smButton.setOnClickListener(newView.OnClickListener() { OverridepublicvoidonClick(View v){ registerListener(); nextActivity(); } });
Memory Leak 8 – Sensor Manager 总结
看过那么多会导致内存泄漏的例子,容易导致吃光手机的内存使垃圾回收处理更为频发,甚至最坏的情况会导致OOM。垃圾回收的操作是很昂贵的开销,会导致肉眼可见的卡顿。所以,实例化的时候注意持有的引用链,并经常进行内存泄漏检查。
Android内存泄漏的八种可能 - 图文



