我的应用运行20分钟后冻结了

问题描述 投票:0回答:0

我有一个运行一堆活动片段的应用程序; 自动> A1:片段> B>C。 活动A及其片段是android.hardware.camera2,我已将其作为库添加到我的应用中。 为了自动运行活动堆栈,我在活动A中有一个用于拍照的处理程序,在活动C中有一个启动活动A的处理程序:

从活动A传递到片段a:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_A);
    if (null == savedInstanceState) {
        getSupportFragmentManager().beginTransaction().replace(R.id.container, a.newInstance()).commit();
    }
    final FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}

用于照片捕获并从片段a传递到活动B的处理程序:

private final CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {   
@Override
    public void onOpened(@NonNull CameraDevice cameraDevice) {
        mCameraOpenCloseLock.release();
        mCameraDevice = cameraDevice;
        createCameraPreviewSession();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                btn.callOnClick();
            }
        }, 5000);
       }

@Override
    public void run() {
        ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
        byte[] bytes = new byte[buffer.remaining()];
        buffer.get(bytes);
        FileOutputStream output = null;
        try {
            output = new FileOutputStream(mFile);
            output.write(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            mImage.close();
            selectedPhotoPath2 = Uri.fromFile(mFile);
            Intent launchIntent = new Intent(getActivity().getBaseContext(), B.class);
            launchIntent.putExtra("uriFile2", selectedPhotoPath2);
            getActivity().startActivity(launchIntent);
            getActivity().finish();
                if (null != output) {
                try {
                    output.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
} 

从活动B传递到活动C:

String packageName = this.getPackageName();
Intent launchIntent2 = this.getPackageManager().getLaunchIntentForPackage(packageName);
    try {
        launchIntent2 = new Intent(this,Class.forName("com.example.ediamanti.imageprocessing.activities.C"));
    launchIntent2.putExtra("uriFile3", path);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    startActivity(launchIntent2);
    finish();

从活动C传回A:

final Handler handler2 = new Handler(Looper.getMainLooper());
    runnable = new Runnable() {
        @Override
        public void run() {
            Intent intent = new Intent(C.this, A.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(intent);
            finish();
        }
    };
    handler2.postDelayed(runnable, 1000);

我的代码运行正常,但运行20分钟后冻结在活动A上。 我希望该应用程序运行一个多小时。 活动冻结时,Logcat中没有错误消息,而我可以返回到应用程序的主菜单,因此活动冻结,但应用程序不会崩溃。

我尝试了不同的方法来解决此问题:

  • 在活动C中使用FLAGS的不同组合(CLEAR_TOP,NEW_TASK等)来清除后退堆栈历史记录。
  • 传递意图时请删除捆绑软件,以避免超出捆绑软件交易限制。
  • 将移动设备的每个日志缓冲区的记录器大小从256KB更改为16MB。
  • 变化处理人员的等待时间。

但它们似乎都不是解决我问题的方法。

是否有人对如何解决此问题有任何想法,或者对我可以按照哪些步骤搜索错误的建议?

Android监视器主线程: 在此处输入图片描述

android android-fragments android-handler android-camera2 back-stack
© www.soinside.com 2019 - 2024. All rights reserved.