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线程。