3

我有一個活動,使用全屏SurfaceHolder,打開相機預覽(基於zxing代碼)。AsyncTask打開相機

開始此活動的結果很慢(1.x秒),我認爲是因爲相機管理員的繁重工作。我正在使用onResume方法;在AsyncTask內移動代碼是一個好主意嗎?

我想馬上渲染布局,然後等待相機(我認爲這是一個更好的用戶體驗)。我該如何處理?

活動

private class CameraTask extends AsyncTask<Void, Void, Void> { 
    SurfaceHolder.Callback callback; 

    public CameraTask(SurfaceHolder.Callback callback) { 
     this.callback = callback; 
    } 
    protected void doInBackground() { 
     cameraManager = new CameraManager(getApplication()); 
     viewfinderView = (ViewFinderView) findViewById(R.id.viewfinder_view); 
     viewfinderView.setCameraManager(cameraManager); 
     SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view); 
     SurfaceHolder surfaceHolder = surfaceView.getHolder(); 

     if (hasSurface) { 
      initCamera(surfaceHolder); 
     } else { 
      surfaceHolder.addCallback(callback); 
     } 
    } 
} 

此代碼有沒有錯誤,但佈局渲染還是等到相機開啓。 我在onResume調用AsyncTask的執行方法,它是正確的位置嗎?

+0

相機在AndroidManifest上有沒有必要的許可? – bofredo

+0

請將您的onResume()方法以及任何相關方法(如initCamera() – user1132959

+0

)中的代碼發佈出去。要找出它正在等待什麼,您應該在任何地方放置日誌消息。這將讓你看到延遲的地方,從那裏你可以找出原因。 – user1132959

回答

1

這裏是你的答案(注意部分):

http://developer.android.com/reference/android/hardware/Camera.html#open%28int%29

注意,它不是那麼簡單,因爲它可能看起來和在其他的答案建議,因爲AsyncTask可能不會立即運行。所以考慮一下:你開始AsyncTask,然後上下文切換到調用onPause()的主線程,因此不會調用釋放,因爲對攝像機的引用是空的。但是現在AsyncThread開始執行再次打開相機。現在你有一個暫停的Activity,它仍然包含一個開放的Camera對象。 一切不涉及:

  • 上依次照相機加入的AsyncTask一些點

  • 或使用一些同步方法

  • 或運行的操作

可導致競爭條件,錯誤(例如在未打開的相機上調用相機方法)和資源泄漏。