我使用Barcode Google API Vision拥有此代码和Iam。当我打开Fragment并将设备旋转6次或更多次时,我在转储堆中看到很多实例仍保留在内存中(参见图)。即使我执行了强制垃圾回收之后,它们仍然保持不变。在下面的代码中,我看不到任何内存泄漏。
奇怪的是,某些设备仅显示1个实例 GC之后的课程是正常的。
jQuery.extend(jQuery.fn.dataTableExt.oSort, {
"date-uk-pre": function (a) {
var ukDatea = a.split('/');
return (ukDatea[2] + ukDatea[1] + ukDatea[0]) * 1;
},
"date-uk-asc": function (a, b) {
return ((a < b) ? -1 : ((a > b) ? 1 : 0));
},
"date-uk-desc": function (a, b) {
return ((a < b) ? 1 : ((a > b) ? -1 : 0));
}
});
MainActivity
Emulator API 27 : NO MEMORY LEAKS
Samsung j500FN : NO MEMORY LEAKS
Xiaomi mi8 : Memory Leak
Galaxy Tablet E : Memory Leak
扫描仪
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
Fragment sf = getSupportFragmentManager().findFragmentByTag("Scanner");
transaction.add(R.id.root, new Scanner(), "Scanner");
transaction.addToBackStack(null);
transaction.commit();
}
});
}
请查看我的代码,并告诉我是否存在内存泄漏。
答案 0 :(得分:-1)
为什么要以barcode
方法发布cameraSource
和onDestroy
?
根据{{3}} onDestroy()
,可以跳过方法,不调用。也许onStop()
是释放资源的更合适的地方?并分别在onStart()
中获取它们。
@Override
public void onStop() {
Log.d("ActivityScan","Destroyed");
if(barcode!=null) {
barcode.release();
Log.d("barcode","Released");
}
if(cameraSource!=null) {
cameraSource.release();
Log.d("cameraSource ","Released");
}
if(cameraView!=null) {
removeCameraViewCallback();
}
super.onStop();
}
此外,在创建Activity
和BarcodeDetector
时不要通过CameraSource
,并在可能的情况下通过ApplicationContext
。