3

我有一个使用全屏的活动SurfaceHolder,打开相机进行预览(基于zxing代码)。

开始这个活动结果很慢(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);
        }
    }
}

此代码没有错误,但布局渲染仍在等待相机打开。我正在调用 in 的 execute 方法AsyncTaskonResume它的位置是否正确?

4

2 回答 2

1

在这里找到解决方案:Show my Layout while SurfaceView is loading Camera Preview。基本上,以编程方式添加 SurfaceView,而不是在您的 xml 布局中。

于 2014-07-01T14:55:00.083 回答
1

这是您的答案(注意部分):

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

请注意,它并不像看起来那么简单,也不像其他答案中所建议的那样简单,因为它AsyncTask可能不会立即运行。所以考虑一下:你启动AsyncTask,然后上下文切换到调用 的主线程onPause(),因此不调用释放,因为对相机的引用为空。但现在AsyncThread开始执行再次打开相机。现在你有一个暂停Activity,它仍然持有一个打开的Camera对象。不涉及的一切:

  • 作为某个点加入 AsyncTask

  • 或使用某种同步方法

  • 或按顺序在相机上运行操作

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

于 2013-07-24T15:13:16.703 回答