AsyncTask打开相机

时间:2013-07-24 13:29:20

标签: android performance android-layout android-asynctask android-camera

我的活动使用全屏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);
        }
    }
}

此代码没有错误,但布局渲染仍等待相机打开。 我在AsyncTask中调用onResume的执行方法,它是正确的位置吗?

2 个答案:

答案 0 :(得分:1)

这是你的答案(警告部分):

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

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

  • 加入AsyncTask作为某些要点

  • 或使用某种同步方法

  • 或依次在相机上运行操作

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

答案 1 :(得分:1)

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