在片段中使用Camera Preview时性能下降

时间:2015-03-18 22:15:39

标签: android android-fragments camera

我的应用包含三个片段。我需要保持用户体验流畅,所以我使用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

1 个答案:

答案 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;
    }
 }

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

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

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

PS:我删除了代码的trycatches,以便于阅读。