Mam taki dziwny problem. Piszę sobie program na Androida i tak mam główną aktywności w niej dwa przyciski które otwierają nowe aktywności. Klikam jeden przycisk i otwiera nowe activity. Następnie tam klikam przycisk po czym aplikacja się wykrzacza pojawia się komunikat, że niestety aplikacja została zatrzymana ale zamiast się zamknąć to tylko zamyka tą aktywność i wyświetla tą pierwszą.
A logcat w logu mówi ze co się stało?
@Shalom
Zastanawia mnie dlaczego aplikacja się nie zamyka całkowicie tylko pokazuje wcześniejsze activity?
05-31 22:03:54.234 2173-2173/eri.testcreator.apptc D/AndroidRuntime﹕ Shutting down VM
05-31 22:03:54.234 2173-2173/eri.testcreator.apptc W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x419bfba8)
05-31 22:03:54.293 2173-2173/eri.testcreator.apptc E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: eri.testcreator.apptc, PID: 2173
java.lang.NullPointerException
at eri.testcreator.apptc.SaveActivity.downloadData(SaveActivity.java:96)
at eri.testcreator.apptc.SaveActivity.access$300(SaveActivity.java:19)
at eri.testcreator.apptc.SaveActivity$1.onClick(SaveActivity.java:66)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18422)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5050)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Tak działa Android. Przechodząc z jednej aplikacji do drugiej, jak ta ostatnia się wysypie to system powraca do poprzedniej. Po drodze może sobie również ubić aktywności, które nie są aktualnie widoczne a następnie przywrócić ich stan np gdy użytkownik użyje przycisku "Back". To samo się dzieje u Ciebie, aktywność B się wysypuje więc Android przywraca poprzednią (A). Generalnie trzeba się wgłębić w temat tasków, procesów i zarządzania zasobami przez system by to dokładnie zczaić ;)
Widzisz wyjątek - poleciał w tym activity więc tylko ono się wysypało bo działa trochę jak osobny wątek.
Zdecydowanie zbyt mało danych podałeś. Stawiam na wyjątek spowodowany wywołaniem funkcji zwrotnej po opuszczeniu aktywności (ale bez dodatkowych danych mogę tylko "gdybać").
Shalom napisał(a):
Widzisz wyjątek - poleciał w tym activity więc tylko ono się wysypało bo działa trochę jak osobny wątek.
Activity nie działa jak osobny wątek. Wszystkie Activity są na jednym stosie w wątku głównym.
Podejrzewam, że Twoje Activity (SaveActivity) odpala operację downloadData w osobnym wątku (np. w AsyncTasku). W tej metodzie leci nullPointerException i Activity się zamyka.
Bez kodu możemy sobie tutaj jedynie powróżyć. Wepnij się debuggerem w to miejsce (klasa SaveActivity.java, linia: 96). Zobacz, co konkretnie jest nullem i spróbuj jakoś obsłużyć tę sytuację lub zmodyfikować kod tak, żeby tego nulla nie było.
nullPointerException był wywołany próbą dodania elementu do nie zainicjalizowanego obiektu ArrayList. Było to spowodowane brakiem pliku z którego miał być odczytany obiekt i funkcja zwracała null.
Dodałem:
if(arrayList==null)
arrayList = new ArrayList<DataFile>();
i teraz już działa.
Możesz pójść o krok dalej i na dzień dobry inicjalizować tę listę. Np. na początku ciała metody lub jako pole w klasie w zależności od tego, jaka jest struktura Twojego kodu. Wtedy w ogóle nie będziesz musiał robić tego sprawdzania.