2015-03-18 47 views
1

我的應用程序包含三個片段。我需要保持流暢的用戶體驗,所以我使用setOffscreenPageLimit()方法將它們全部保留在內存中。在片段中使用相機預覽時性能下降

問題:當我開始一個新的活動(甚至是空的)時,它的加載速度很慢。當我完成它時也是如此。

我知道這是來自我的相機預覽片段,因爲當我註釋掉相機的init時,一切都運行得非常順利。

這是我如何初始化我的相機預覽上的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方法被調用這破壞了攝像頭預覽。當新活動終止時,應用程序再次重新創建相機視圖。

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

如看到的traceview()花在stopPreview的時間和釋放()方法。大約需要700毫秒才能銷燬相機預覽。

Screenshot of Traceview

+0

使用Traceview來確定你的時間花在哪裏。 – CommonsWare 2015-03-18 22:28:51

+0

大約有700毫秒用於銷燬和釋放相機。 280毫秒重新創建相機預覽。 PS:我沒有足夠的代表發佈屏幕截圖... – daarthvader 2015-03-19 11:10:03

+0

「我沒有足夠的代表發佈屏幕截圖」 - 歡迎您在其他位置上傳圖片並鏈接到這裏。 「約700ms花在銷燬和釋放相機上」 - 我還沒有試過將'stopPreview()'或'release()'移動到後臺線程中,但這對你的情況值得一試。 – CommonsWare 2015-03-19 11:31:53

回答

2

基於@CommonsWare建議,這裏是我做到了。

首先,我把我的mCamera變量在應用程序類

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

最後,我只是撥打我的AsyncTask onResumeonPause種方法

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

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

PS:我除去trycatches爲代碼以易於閱讀。