我的活动使用全屏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
的执行方法,它是正确的位置吗?
答案 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布局中添加。