【问题标题】:AsyncTask Open CameraAsyncTask 打开相机
【发布时间】:2013-07-24 00:21:45
【问题描述】:

我有一个使用全屏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);
        }
    }
}

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

【问题讨论】:

  • 相机是否已经在 AndroidManifest 上获得了必要的权限?
  • 请在您的 onResume() 方法以及 initCamera() 等任何相关方法中发布代码
  • 要找出它在等待什么,您应该将日志消息放在任何地方。这将使您能够查看延迟的位置并从中找出原因。
  • Manifest 没问题,onResume 调用任务执行(仅此而已),initCamera 只需打开(方法)Camera。
  • 在某些设备上打开相机可能会长时间保持 UI 线程。

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


【解决方案1】:

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

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

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

  • 作为某个点加入 AsyncTask

  • 或使用某种同步方法

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多