2015-05-12 11 views
7

Sto cercando di capire quali thread dovrebbero fare cosa in Android.Fotocamera Android: discussioni? Quale dovrebbe fare cosa

L'unica cosa che ho trovato indicato nella documentazione ufficiale è che camera.open() deve essere inserito in una propria discussione.

Che dire:

  • camera.startPreview()
  • camera.stopPreview()
  • camera.release()

Esso non precisa quale thread hanno bisogno . Devono essere eseguiti sul thread principale (thread ui)? O sono libero di scegliere?

Perché sto cercando di capirlo? camera.startPreview() quando eseguito sul thread principale causa il jitter/lag della mia app per un breve periodo di tempo, questo influisce pesantemente sulla mia applicazione in quanto è inserita in un viewPager e non desidero che la fotocamera visualizzi sempre l'anteprima (il che causerebbe nessun ritardo, ma richiede risorse di sistema).

Qualche idea?

risposta

3

La documentazione per Camera afferma che la classe non è thread-safe e dovrebbe non essere chiamato da più thread contemporaneamente (suppongo, a meno che non si sta eseguendo la propria sincronizzazione).

Si dice che i callback saranno consegnati al thread che effettua la chiamata al open

dal riferimento (sottolineatura mia):

Questa classe non è thread-safe, ed è significato per l'uso da un thread evento. La maggior parte delle operazioni di lunga durata (anteprima, messa a fuoco, acquisizione foto, ecc.) Si verificano in modo asincrono e invocano i callback secondo necessità. Le callback saranno invocate sul thread di eventi aperto (int) è stato chiamato da. I metodi di questa classe non devono mai essere richiamati da più thread contemporaneamente.

Dalla riferimento open(int) metodo:

richiamate da altri metodi sono consegnati al loop caso di filo che chiama open(). Se questo thread non ha loop eventi, i callback vengono consegnati al loop eventi dell'applicazione principale. Se non esiste un ciclo di eventi dell'applicazione principale, i callback non vengono consegnati.

Attenzione: su alcuni dispositivi, questo metodo potrebbe richiedere molto tempo. È meglio chiamare questo metodo da un thread di lavoro (possibilmente utilizzando AsyncTask) per evitare di bloccare il thread dell'interfaccia utente dell'applicazione principale.

Il filo è bisogno è quello che si usa chiamare open(int).

Quindi per rispondere alla tua domanda, sì, sei relativamente libero di scegliere, ma devi rimanere coerente.

+0

Bravo, quindi sono corretto quindi utilizzare un HandlerThread per gestire * tutte * le operazioni della fotocamera. Per aggiungere alla domanda originale; Che dire di SurfaceView e SurfaceHolder.Callbacks? Dai miei test i callback sono creati sul thread principale, quindi devo usare il mio HandlerThread per gestire quelli (i callback)? –

+0

@KarlMorrison È certamente possibile delegare, ma l'assunto assunto dagli strumenti è che il thread che esegue 'SurfaceView' è quello che gestisce i callback. Gli stati di riferimento: _ "Quando si utilizza questa interfaccia da un thread diverso da quello che esegue SurfaceView, è necessario leggere attentamente i metodi lockCanvas() e Callback.surfaceCreated()." _ –

Problemi correlati