3

У меня есть активность, которая использует полный экран SurfaceHolder, открывая камеру для предварительного просмотра (на основе кода zxing).AsyncTask Open Camera

Запуск этого действия медленный (1,1 секунды), я думаю, из-за тяжелого подъема диспетчера камеры. Я использую метод 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

У камеры уже есть разрешение на AndroidManifest? – bofredo

+0

Пожалуйста, разместите код в методе onResume(), а также любые связанные с ним методы, такие как initCamera() – user1132959

+0

Чтобы узнать, что он ждет, вы должны размещать сообщения журнала повсюду. Это позволит вам увидеть, где задержка, и оттуда вы можете узнать, почему. – user1132959

ответ

1

Вот ваш ответ (осторожно часть):

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

Обратите внимание, что это не так просто, как это может казаться, и как это было предложено в других ответах, так как AsyncTask не может работать сразу. Так что рассмотрите это: вы начинаете AsyncTask, тогда контекст переключается на основной поток, который вызывает onPause(), поэтому не вызывает выпуск, поскольку ссылка на камеру равна нулю. Но теперь AsyncThread начинает выполнение снова открытия камеры. Теперь у вас есть приостановленный Activity, который все еще содержит открытый объект Camera. Все, что не включает в себя:

  • присоединения к AsyncTask в какой-то момент

  • или с помощью какой-то способ синхронизации

  • или запущенные операции на последовательно камеры

может приводят к условиям гонки, ошибкам (например, при вызове методов камеры на не открывшейся камере) и утечке ресурсов ,