好文档 - 专业文书写作范文服务资料分享网站

Android内存泄漏的八种可能 - 图文

天下 分享 时间: 加入收藏 我要投稿 点赞

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。垃圾回收的操作是很昂贵的开销,会导致肉眼可见的卡顿。所以,实例化的时候注意持有的引用链,并经常进行内存泄漏检查。

20qoj54nen3jk4h7sglc72h8v7sa2300vlp
领取福利

微信扫码领取福利

微信扫码分享