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一些点

  • 或使用一些同步方法

  • 或运行的操作

可导致竞争条件,错误(例如在未打开的相机上调用相机方法)和资源泄漏。