2012-08-09 8 views
5

Buduję aplikację dla systemu Android, na której chciałbym poczekać, aż nastąpi PictureCallback, zanim aktywność wywołująca będzie kontynuowana.Aktywność "Wstrzymaj" w oczekiwaniu na wystąpienie funkcji PictureCallback

import android.hardware.Camera; 

private Camera camera 
private Bitmap picture; 

camera.takePicture(null, null, new PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inSampleSize = 1; 
    picture = BitmapFactory.decodeByteArray(data , 0, data.length, options); 
    } 
} 

... do some other logic with picture 

Chciałbym zachować oddzielną logikę i dlatego chciałbym uniknąć jej kodowania w funkcji takePicture.

Czy można to osiągnąć?

+0

Próbuję zrobić dokładnie to samo. Dobre pytanie. –

Odpowiedz

0

Złą praktyką jest blokowanie wątku interfejsu użytkownika podczas wykonywania jakichkolwiek prac w tle.

Jeśli zadzwonisz do wbudowanej funkcji Aparat, Twoja aktywność będzie widoczna w tle. Po zrobieniu zdjęcia i zamknięciu aktywności aparatu, zanim wrócisz do swojej aktywności, zdjęcie zostanie zapisane.

Jeśli używasz własnej implementacji Camera, powinieneś wyświetlić ProgressDialog, a jeśli masz jakieś prace w tle do zrobienia, powinieneś zrobić to w osobnym wątku.

+0

Rzeczywiście używam własnej implementacji kamery. Nie widzę, jak użycie ProgressDialog może rozwiązać ten problem. Sposób kod jest wykonywany jest w następujący sposób: 1) sfotografować 2) zrobić następny logikę 3) callback zwraca obraz chciałbym go w następującej kolejności: 1 3 2 – Gillain

+1

źle zrozumiałem pytanie tak wydaje. Ale możesz po prostu napisać swoje 2) w osobnej metodzie i wywołać ją na końcu funkcji zwrotnej. –

+0

Dziękujemy za szybką odpowiedź. Twoja sugestia może być rozwiązaniem, ale powodem, dla którego mam tyle problemów, jest to, że staram się, aby mój kod był jak najbardziej abstrakcyjny. W moim projekcie mam działanie i oddzielną klasę kamery. Wywołuję funkcję takePicture w klasie Camera, która będzie musiała poczekać na wywołanie zwrotne, a następnie powrócić do działania. Problem polega na tym, że kod w działaniu PO wywoływaniu takePicture jest wykonywany PRZED odwróceniem ma szansę zwrócić bitmapę. Powiedz, czy wolałbyś zobaczyć cały kod. – Gillain

0

Można go zaimplementować w dwóch wątkach. Zaraz po wywołaniu PictureCallback nazywa się call wait() w bieżącym wątku. Następnie, po zakończeniu funkcji PictureCallback, wywołaj funkcję notify(), aby wątek oczekujący wiedział, że można ją zakończyć. Ale nie chcesz blokować głównego wątku. Możesz, jeśli chcesz/potrzebujesz, ale nie jest to dobry pomysł.

+0

Próbowałem zaimplementować PictureCallback w innym wątku, ale to się nie udało. W jakiś sposób wywołania zwrotne są zawsze uruchamiane w głównym wątku. – Gillain