我的应用程序包含三个片段。我需要保持用户体验的流畅性,因此我正在使用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毫秒。
Screenshot of Traceview
最佳答案
基于@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:我删除了使代码易于阅读的尝试。