2013-05-04 16 views
5

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

+1

Czy sprawdzić czy onPostExecute() został sprawdzony dla AsyncTask. – Anirudh

+0

Tak, zrobiłem. Wprowadzam punkt przerwania i po prostu zawiesza się na linii wywołującej słuchacza. dziękuję – KuriaNdungu

Odpowiedz

3

Dostałem odpowiedź! Nie inicjowałem słuchacza w mojej klasie wywołującej. wszystko, co potrzebne do zrobienia było umieścić w tym wierszu

db.setDbProcesslistener(this); 

tj

DatabaseRoutines db = new DatabaseRoutines(MyActivity.this); 
db.setDbProcesslistener(MyActivity.this); 

i zaczęło działać.

Dziękujemy wszystkim, którzy mieli zapoznać i starał się wymyślić rozwiązanie :)

+0

@ KuriaNdungu - DZIĘKUJEMY za umieszczenie tego, co DZIAŁA. Dziękuję TAKŻE za ZADOWALAJĄCE ZADANIE pokazujące wystarczającą ilość twojego kodu, że KAŻDY może teraz spróbować zastosować tę technikę. – DSlomer64

+0

AH, MAN !!!!!! Jedyne, co zrobiłem, było staranne wycięcie i wklejenie pierwszych 3 i 5 kawałków kodu @ Kuria do mojej aplikacji i zmodyfikowałem własną 'onPostExecute', aby mieć jedną linię -' dbProcesslistener.ProcessingIsDone (true); 'następnie otrzymałem NPE, więc Obudziłem się i wkleiłem w jego linii, aby pasowało do mojej 'app':' dbc.setDbProcesslistener (this); 'AND IT WORKED. BADANIE TEGO PRZYKŁADU BARDZO ważnej techniki. SUPER PRACA, Kuria !! To przykładowe SO Q i (UŻYTKOWNIK!) Działający A! – DSlomer64

+0

@ DSlomer64 1) star the question 2) upvote erythang 3) rozpocznij nagrodę i daj ją Kurii. – Will

3

Brzmi jak zmienna dbProcesslistener jest NULL. Czy nazywasz swojego settera i przekazujesz mu zainicjowany obiekt Listener jakiś czas przed wywołaniem dbProcesslistener.ProcessingIsDone(true);?

+0

Dzięki. to był właściwie problem. nie zainicjowałem przed wywołaniem. – KuriaNdungu

+0

Zapomniałem. Teraz zrobione :) – KuriaNdungu

Powiązane problemy