传递片段时Android内存泄漏

时间:2018-10-23 07:11:43

标签: android memory-leaks android-vision

我使用Barcode Google API Vision拥有此代码和Iam。当我打开Fragment并将设备旋转6次或更多次时,我在转储堆中看到很多实例仍保留在内存中(参见图)。即使我执行了强制垃圾回收之后,它们仍然保持不变。在下面的代码中,我看不到任何内存泄漏。

图片在GC之后 enter image description here

  

奇怪的是,某些设备仅显示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(); 

        }
    });
}

请查看我的代码,并告诉我是否存在内存泄漏。

泄漏金丝雀显示以下内容: enter image description here enter image description here

1 个答案:

答案 0 :(得分:-1)

为什么要以barcode方法发布cameraSourceonDestroy? 根据{{​​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();
}

此外,在创建ActivityBarcodeDetector时不要通过CameraSource,并在可能的情况下通过ApplicationContext