Android 异步任务开放式摄像机

Android 异步任务开放式摄像机,android,performance,android-layout,android-asynctask,android-camera,Android,Performance,Android Layout,Android Asynctask,Android Camera,我有一个活动,使用全屏SurfaceHolder,打开相机进行预览(基于zxingcode) 开始这项活动的速度很慢(1.x秒),我认为这是因为相机管理器的繁重工作。我正在使用onResume方法;将代码移动到异步任务中是一个好主意吗 我想立即渲染布局,然后等待相机(我认为这是更好的用户体验)。我该怎么办 活动 private class CameraTask extends AsyncTask<Void, Void, Void> { SurfaceHolder.Callba

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

开始这项活动的速度很慢(1.x秒),我认为这是因为相机管理器的繁重工作。我正在使用
onResume
方法;将代码移动到
异步任务
中是一个好主意吗

我想立即渲染布局,然后等待相机(我认为这是更好的用户体验)。我该怎么办

活动

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);
        }
    }
}
私有类CameraTask扩展异步任务{
SurfaceHolder.Callback;
公共CameraTask(SurfaceHolder.Callback){
this.callback=回调;
}
受保护的void doInBackground(){
cameraManager=新的cameraManager(getApplication());
viewfinderView=(viewfinderView)findViewById(R.id.viewfinder\U视图);
setCameraManager(cameraManager);
SurfaceView SurfaceView=(SurfaceView)findViewById(R.id.preview\u视图);
SurfaceHolder SurfaceHolder=surfaceView.getHolder();
if(hasSurface){
Init摄像机(surfaceHolder);
}否则{
addCallback(回调);
}
}
}
此代码没有错误,但布局渲染仍等待打开摄影机。 我正在调用
onResume
中的
AsyncTask
执行方法,它的位置正确吗?

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

请注意,它并不像看上去那么简单,也不像其他答案中所建议的那样简单,因为
AsyncTask
可能不会立即运行。因此,考虑一下:启动<代码> AycCastase<代码>,然后将上下文切换到调用<代码> OnPAUSEE()//>代码的主线程,因此不调用释放,因为对摄像机的引用为NULL。但是现在,
AsyncThread
再次开始执行,打开相机。现在您有了一个暂停的
活动
,它仍然保存着一个打开的
摄影机
对象。 不涉及的一切:

  • 作为某个点加入异步任务

  • 或者使用一些同步方法

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


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

此处找到的解决方案:。基本上,以编程方式而不是在xml布局中添加SurfaceView。

摄像机是否已经对AndroidManifest拥有必要的权限?请在onResume()方法以及initCamera()等任何相关方法中发布代码,以了解它在等待什么,您应该将日志消息放在任何地方。这将允许您查看延迟的位置,并从中找出原因。Manifest正常,onResume调用task execute(而不是其他),initCamera只是打开(方法)Camera。打开Camera可能会在某些设备上长时间保持UI线程。