2012-12-11 21 views
9

Ok, więc teraz mam Class A, która zawiera niektóre spinnerów, których wartości zostaną wypełnione przez Class B, która rozszerza AsnycTask, która pobiera wartości spinnera z usługi sieciowej. W klasie B udało mi się odzyskać wartości, pokazując toast. Problem polega teraz na tym, jak przekazać te wartości spinner z powrotem do klasy A?Wartość zwracana z klasy AsyncTask metoda onPostExecute

Próbowałem

Can OnPostExcecute method in AsyncTask RETURN values?

przekazując Class A do Class B i zapisać wartość w zmiennej publicznej Class A jak poniżej

@Override 
protected void onPostExecute(String result) 
{ 
    classA.classAvariable = result; 
} 

Jednak gdy próbuję odczytać classAvariable ja zawsze otrzymuj NullPointer Exception. Wygląda na to, że zmienna nigdy nie została przypisana do wyniku. Dla celów czytelności musiałem oddzielić Class B zamiast używać jako klasy wbudowanej.

Jakieś pomysły dla moich kolegów programistów Java?

+0

podać kod, które zostały napisane –

Odpowiedz

29

Chyba próbują odczytać zmienną klasy A zanim jest on ustawiony .. spróbuj zrobić to przy użyciu funkcji zwrotnej callbacks..in przekazać wartości i odświeżyć błystki ..

Można tworzyć interface przechodzą do AsyncTask (w konstruktora), a następnie wywołać Sposób onPostExecute

na przykład:

interfejsu:

public interface OnTaskCompleted{ 
    void onTaskCompleted(values); 
} 

Twój aktywny:

public YourActivity implements OnTaskCompleted{ 
    //your Activity 
    YourTask task = new YourTask(this); // here is the initalization code for your asyncTask 
} 

A twój AsyncTask:

public YourTask extends AsyncTask<Object,Object,Object>{ //change Object to required type 
    private OnTaskCompleted listener; 

    public YourTask(OnTaskCompleted listener){ 
     this.listener=listener; 
    } 

    //required methods 

    protected void onPostExecute(Object o){ 
     //your stuff 
     listener.onTaskCompleted(values); 
    } 
} 
+0

Thanks to działa! Czy jednak możesz wyjaśnić racjonalne uzasadnienie tego kodu? Ponieważ wygląda podobnie do implementowania metody getter w klasie AsyncTask (choć nie działa w rzeczywistości). –

+2

Jest to rodzaj funkcji zwrotnej, która zamiast przekazywania czynności do zadania, przekazuje odbiornik (jak odbiornik przycisków) po zakończeniu zadania, wywołuje wywołanie zwrotne (wywołuje działanie, które realizuje to wywołanie zwrotne), a następnie aktywność rób, co chce – Nermeen

+1

Popraw mnie, jeśli się mylę, do mojej logiki implementacja interfejsu jest wywoływana, gdy AsyncTask jest wykonywana podczas implementacji metody getter może nie działać, ponieważ AsyncTask może nie zostać zakończona przed wywołaniem tej metody. Czy to jest poprawne? –

0

utworzyć interfejs jak OnCompletRequest() następnie przekazać to do konstruktora ClassB i po prostu wywołać metodę wewnątrz tego interfejsu, takich jak complete(yourList list) w metodzie z onPostExecute(String result)

+0

Czy możesz podać krótki fragment kodu? Nie jestem pewien, w jaki sposób można wdrożyć interfejs w klasie AsyncTask. –

+0

Właśnie zaktualizowałem kod @Nunu, aby pomóc Ci, jak to będzie działać. –

+0

Dziękuję bardzo! To było bardzo pomocne! –

1

Problem polega na tym, że po uruchomieniu AsynchTask, jego metoda doInBackground() działa w osobnym wątku i wątek, który rozpoczął tę AsynchTask przesunąć do przodu, W ten sposób zmiany występują w zmiennej przez AsynchTask nie odbija się bezpośrednio na wątku nadrzędnym (który stwierdził tę AsynchTask).

Przykład -

class MyAsynchTask 
{ 

doInbackground() 
{ 
a = 2; 
} 

} 


int a = 5; 

new MyAsynchTask().execute(); 

// tu jeszcze 5

+0

dobrze, jeśli przeczytałeś mój kod, zrobiłem to zadanie w metodzie onPostExecute. Które ma działać w wątku UI? –

+0

tak! onPostExecute działa w wątku UI, ale po zakończeniu doInbackground. – Mufazzal