我的应用程序包含三个片段。我需要保持用户体验的流畅性,因此我正在使用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;
    }
 }




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



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







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




PS:我删除了使代码易于阅读的尝试。

10-07 19:27