2012-04-29 56 views
7

Napisałem aplikację, a teraz, po wydaniu, niektórzy z moich użytkowników mają paskudny błąd. Tego, którego po prostu nie mogę odtworzyć.Android onActivityResult. Zmienna użytkownika jest czasami pusta

Zaangażowane są w to trzy działania.

aktywny 1: SuperActivity

public abstract class SuperActivity extends Activity 

Activity 2: główną działalność

public class MainActivity extends SuperActivity { 

    private MyObject myMemberVariable;  

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

    //Get the intent that started this activity. I am always providing Extras, so this is never null. 
    Bundle bundle = getIntent().getExtras(); 

    //Set stuff in myMemberVariable from these extras. This never fails either. 
    myMemberVariable = BundleLoader.loadFromBundle(bundle); 

    } 


    @Override 
    public void onListDialogClick(int requestCode, String[] options, int position, String extra) { 
    //THIS is the place where, according to my stacktrace from the DeveloperConsole, the null pointer arises. 
    myMemberVariable.setXY(position); 
    } 

Activity 3: ListDialogActivity

public class ListDialogActivity extends SuperActivity 

Co ja robię tu ja uruchomić ListDialogActivity z główną działalność przedstawić użytkownikowi kilka opcji. Po dokonaniu wyboru, ListDialogActivity ustawi wynik, a następnie zakończy. W SuperActivity mam:

onActivityResult(int requestCode, int resultCode, Intent data) { 
    //if activityRequestCode was ListDialogRequestCode and the Result was RESULT_OK, then call onListDialogClick(..) with the appropriate values. 
} 

Tak to jest jak onListDialogClick() w moim główną działalność jest wywoływany (Więc można tylko myśleć o nim jako o normalnym onActivityResult()). Tam, NIEKTÓD kilku użytkowników ma wyjątek wskaźnika pustego, ponieważ mojaMemberVariable ma wartość null.

Nie mogę dowiedzieć się, co się tutaj dzieje. Ponadto zapisuję stan wystąpienia, aby obsłużyć obrót telefonu, ale nawet jeśli nie, ponieważ onCreate zostanie przywołany, nadal nie będzie miał wartości NULL, utraciłby tylko swój stan i został odtworzony z pierwotnego założenia.

Czy ktoś może mi wyjaśnić, jak to jest możliwe i co się tutaj dzieje? Czy nie udało mi się zrozumieć czegoś z Androida? Dlaczego dzieje się tak tylko z kilkoma osobami? Co mogłoby być tego przyczyną? Byłbym bardzo wdzięczny za choćby najmniejszą sugestię.

Dziękuję bardzo!

+1

Jakiś wspólny czynnik z urządzeniami, na których się to dzieje? – JRaymond

+0

Nie znalazłem jeszcze wspólnego elementu (jestem pewien, że stało się to z kimś z Galaxy S2 z CM9 i kimś z HTC jeden x.) Ale poza tym nie wiem, ponieważ konsola dev nie pokaż mi urządzenia, z których pochodzą błędy. – metter

+1

gdzie jest zainicjowana opcja 'myMemberVariable'? W kodzie widzę, że musi zawsze mieć wartość 'null', ponieważ jest równe' private MyObject myMemberVariable = null; ' – zapl

Odpowiedz

10

zapl jest poprawny, ponieważ musisz zapisać wartości w onSaveInstanceState, aw moim przypadku przywracam w onCreate(), która działa BEFORE onActivityResult, więc nie więcej NullPointerExceptions!

Prawdopodobnie posortowałeś to już teraz, ale miałem masę problemów z tym samym problemem. Moja aplikacja uruchamia aparat, aby zrobić zdjęcie, a następnie skopiować przechwycony plik do bieżącego katalogu w aplikacji. Czasami, gdy zdjęcie zostało zrobione, otrzymywałem NullPointerExceptions w onActivityResult.

Zajęło mi trochę czasu, zanim zdałem sobie sprawę, że aktywność musiała zostać zabita przez zarządzanie pamięcią androidów i odtworzona, tracąc wszystkie moje zmienne członkowskie. To nie było oczywiste (czapki z systemem Android dla takiego bezproblemowego zabicia/przywracania!). To działo się w HTC Desire HD i było tak przypadkowe, że bardzo trudno było je wyśledzić.

+0

Wielkie dzięki za tę odpowiedź! Miałem ten sam problem i nie mogłem tego rozgryźć. Dobra robota;) –

+1

Wow, 5 lat później, nadal istotne, i uratowałem mi tyłek; dzięki za to. Taki nieuchwytny błąd! – pete

Powiązane problemy