Mam pewne zamieszanie na temat używania Słuchaczy do przekazywania informacji między zajęciami i zajęciami.Zdarzenie wyzwalające, gdy AsyncTask jest kompletny za pomocą Listenera
Scenariusz jest następujący:
Mam zadanie, które odczytuje dane z bazy danych Sqlite i umieszcza te dane w tablicy ArrayList, która jest przekazywana do adaptera, a następnie wyświetla je na ekranie.
Pytanie:
Moja aplikacja ulega awarii podczas próby zaktualizowania interfejsu odbiornika o wartość. Nie pokazuje niczego w logcat ... po prostu zawiesza aplikację. Czy ktoś może wskazać, gdzie idę źle. - Dzięki
Szczegóły:
Mam przetwarzanie bazy danych wykonane przez klasę o nazwie DatbaseRoutines, a wewnątrz to wewnętrzna metoda wykonywania podnoszenia ciężkich. metoda używa AsyncTask, aby nie nękać głównego wątku.
Stworzyłem i interfejs z jednej metody
public interface DatabaseProcessListener {
public void ProcessingIsDone(boolean blnProcessIsFinished);
}
W mojej klasie DatabaseRoutines tworzę prywatną zmienną
private DatabaseProcessListener dbProcesslistener;
wraz z seter na nim
public void setDbProcesslistener(DatabaseProcessListener dbProcesslistener) {
this.dbProcesslistener = dbProcesslistener;
}
Po zakończeniu przetwarzania używam metody PostExecute, aby zaktualizować Listenera, aby to umożliwić zmień wartość w słuchacza na prawdziwe (czyli, że przetwarzanie odbywa db) Poniżej znajduje się kod
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
dialog.dismiss(); //i have progress dialog during processing and its
//closed here
if (blnUpdateSucceededStatus)
{
dbProcesslistener.ProcessingIsDone(true);
}
else
{
Toast.makeText(ctx, "Transactions Processing
failed",Toast.LENGTH_SHORT);
} ;
Wreszcie w działalności Wyświetlanie danych zebranych z bazy danych zaimplementować słuchacza. patrz poniżej.
public class MyActivity extends Activity implements DatabaseProcessListener
{
@Override
public void ProcessingIsDone(boolean blnProcessIsFinished) {
if(blnProcessIsFinished){
PopulateExpandableListView();
}
public void PopulateExpandableListView() {
//code for populating the listview goes here;
}
}
po pewnym kopania znalazłem logcat error..its wyjątek NullPointer
05-05 11:11:18.590: ERROR/AndroidRuntime(22339): FATAL EXCEPTION: main
java.lang.NullPointerException
at com.example.mledger.DatabaseRoutines$1.onPostExecute(DatabaseRoutines.java:258)
at com.example.mledger.DatabaseRoutines$1.onPostExecute(DatabaseRoutines.java:141)
at android.os.AsyncTask.finish(AsyncTask.java:631)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4921)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
at dalvik.system.NativeStart.main(Native Method)
Niestety aplikacja wisi, a interfejs nie aktualizuje aktywny, który wyświetla dane z prawdą (czyli przetwarzania odbywa)
Wskaż mi właściwy kierunek. - Dzięki
Czy sprawdzić czy onPostExecute() został sprawdzony dla AsyncTask. – Anirudh
Tak, zrobiłem. Wprowadzam punkt przerwania i po prostu zawiesza się na linii wywołującej słuchacza. dziękuję – KuriaNdungu