gpt4 book ai didi

android - 在 fragment 中使用相机预览时性能下降

转载 作者:行者123 更新时间:2023-11-29 20:51:04 25 4
gpt4 key购买 nike

我的应用包含三个 fragment 。我需要保持用户体验流畅,所以我使用 setOffscreenPageLimit() 方法让它们在内存中保持 Activity 状态。

问题:当我开始一个新 Activity (即使是空 Activity )时,它加载缓慢。当我完成它时也是如此。

我知道这是来 self 的相机预览 fragment ,因为当我注释掉相机的初始化时,一切都运行得非常顺利。

以下是我如何在 OnResume 方法上初始化相机预览:

mCamera = GetCameraInstance(currentCameraId);

//-- Set the SurfaceView
preview = (SurfaceView) view.findViewById(R.id.camera_preview);
mSurfaceHolder = preview.getHolder();
mSurfaceHolder.addCallback(this);

if (mCamera != null) {

mCamera.setPreviewDisplay(mSurfaceHolder);
mCamera.startPreview();

}

当新 Activity 启动时,会调用 surfaceDestroyed 方法来销毁相机预览。当新 Activity 终止时,应用会再次重新创建相机 View 。

@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
if (mCamera != null) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}

在 traceview 上看到的在 stopPreview() 和 release() 方法上花费的时间。销毁相机预览大约需要 700 毫秒。

Screenshot of Traceview

最佳答案

根据@CommonsWare 的建议,我是这样做的。

首先,我将我的 mCamera 变量放在应用程序类中

public Camera mCamera;

然后,我将 AsyncTask 放在我的 fragment 中

 private class ControlCameraTask extends AsyncTask<Integer, Void, Void> {

protected Void doInBackground(Integer... urls) {

//--
if (app.mCamera != null) {
app.mCamera.stopPreview();
app.mCamera.release();
app.mCamera = null;
} else {
app.mCamera = GetCameraInstance(currentCameraId);
app.mCamera.setPreviewDisplay(app.mSurfaceHolder);
app.mCamera.startPreview();
}

return null;
}
}

最后,我只是在 onResumeonPause 方法上调用我的 AsyncTask

@Override
public void onResume() {
super.onResume();
new ControlCameraTask().execute(1);
}

@Override
public void onPause() {
super.onPause();
new ControlCameraTask().execute(1);
}

PS:我删除了 trycatches 以使代码易于阅读。

关于android - 在 fragment 中使用相机预览时性能下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29133737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com