我的应用包含三个片段。我需要保持用户体验流畅,所以我使用setOffscreenPageLimit()方法让它们在内存中保持活跃。
问题:当我开始一个新的活动(甚至是空的)时,它会慢慢加载。当我完成它时也一样。
我知道这是来自我的Camera Preview片段,因为当我注释掉相机的初始化时,一切都运行得很顺利。
以下是我在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();
}
当新活动开始时,将调用surfaceDestroyed方法,该方法会破坏Camera预览。当新活动终止时,应用程序将再次重新创建相机视图。
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
if (mCamera != null) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
在traceview上看到的stopPreview()和release()方法所花费的时间。破坏相机预览需要大约700毫秒。
答案 0 :(得分:2)
根据@CommonsWare的建议,我就是这样做的。
首先,我将mCamera变量放在Application类中
public Camera mCamera;
然后,我将AsyncTask放入我的片段中
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;
}
}
最后,我只是在onResume
和onPause
方法上调用我的AsyncTask
@Override
public void onResume() {
super.onResume();
new ControlCameraTask().execute(1);
}
@Override
public void onPause() {
super.onPause();
new ControlCameraTask().execute(1);
}
PS:我删除了代码的trycatches,以便于阅读。