私有内部类导致内存泄漏解决方案

时间:2019-10-10 10:03来源: 操作系统
明日在修补电池项目内部存储器泄漏的地点学到了贰个新的学问点. 私家内部类(无名的私有内部类也算)中会有一个外表类的引用,那么当此中类对象未有被死灭,外界类也不会被销

明日在修补电池项目内部存储器泄漏的地点学到了贰个新的学问点.

私家内部类(无名的私有内部类也算)中会有一个外表类的引用,那么当此中类对象未有被死灭,外界类也不会被销毁,那点很轻易忽略进而致使内部存储器泄漏.

代码如下:这样的佚名内部类使用会产生OutOfMemActivity的内部存款和储蓄器泄漏

public class OutOfMemActivity extends Activity implements View.OnClickListener{ public static final String ACTION_INTENT_FILTER = "ACTION_INTENT_FILTER"; private Button btn; private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { new Thread(){ @Override public void run() { super.run(); while { try { Thread.sleep; } catch (InterruptedException e) { e.printStackTrace(); } Log.i("tag","running ... "+OutOfMemActivity.this); } } }.start(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_out_of_mem); btn = findViewById(R.id.btn_send); btn.setOnClickListener; IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ACTION_INTENT_FILTER); registerReceiver(broadcastReceiver,intentFilter); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(broadcastReceiver); } @Override public void onClick { switch ){ case R.id.btn_send: Intent intent = new Intent(); intent.setAction(ACTION_INTENT_FILTER); sendBroadcast; break; } }}

咱俩可用通过弱援引化解该难点(关于强援用,软引用,弱援引,虚引用传送门),大家改写这一个广播接收器使它产生静态内部类如下:

private static class MyBroadcastReceiver extends BroadcastReceiver{ private WeakReference<OutOfMemActivity> outOfMemActivityWeakReference; public MyBroadcastReceiver(WeakReference<OutOfMemActivity> outOfMemActivityWeakReference) { this.outOfMemActivityWeakReference = outOfMemActivityWeakReference; } @Override public void onReceive(Context context, Intent intent) { new Thread(){ @Override public void run() { super.run(); while { try { Thread.sleep; } catch (InterruptedException e) { e.printStackTrace(); } OutOfMemActivity outOfMemActivity = outOfMemActivityWeakReference.get(); Log.i("tag","running ... "+outOfMemActivity); } } }.start(); }}

这么一旦应用OutOfMemActivity对象,它是以弱引用传送进来,在垃圾堆回收器扫描到该指标的时候就能回收掉它.

图片 1资料图

亟待材质的相恋的人可以投入Android架构沟通QQ群聊:513088520

点击链接参预群聊【Android移动架构总群】:参预群聊

获得无需付费上学录制,学习纲要别的还会有像高档UI、品质优化、框架结构师课程、NDK、混合式开荒(ReactNative+Weex)等Android高阶开荒资料免费享受。

编辑: 操作系统 本文来源:私有内部类导致内存泄漏解决方案

关键词:

  • 上一篇:没有了
  • 下一篇:没有了