2011-11-10 21 views
10

Mam projekt dla HoneyComb i pojawia się błąd po użyciu metody reconate() w metodzie onResum() w mojej głównej aktywności.wykonywanie pauzy aktywności, która nie została wznowiona po odtworzeniu metody

11-10 22:05:42.090: E/ActivityThread(1917): Performing pause of activity that is not  resumed: {com.blogspot.honeyapp/com.blogspot.honeyapp.Main} 
11-10 22:05:42.090: E/ActivityThread(1917): java.lang.RuntimeException: Performing pause of activity that is not resumed: {com.blogspot.honeyapp/com.blogspot.honeyapp.Main} 
11-10 22:05:42.090: E/ActivityThread(1917):  at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2517) 
11-10 22:05:42.090: E/ActivityThread(1917):  at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2505) 
11-10 22:05:42.090: E/ActivityThread(1917):  at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2483) 
11-10 22:05:42.090: E/ActivityThread(1917):  at android.app.ActivityThread.access$700(ActivityThread.java:122) 
11-10 22:05:42.090: E/ActivityThread(1917):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1031) 
11-10 22:05:42.090: E/ActivityThread(1917):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-10 22:05:42.090: E/ActivityThread(1917):  at android.os.Looper.loop(Looper.java:132) 
11-10 22:05:42.090: E/ActivityThread(1917):  at android.app.ActivityThread.main(ActivityThread.java:4123) 
11-10 22:05:42.090: E/ActivityThread(1917):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-10 22:05:42.090: E/ActivityThread(1917):  at java.lang.reflect.Method.invoke(Method.java:491) 
11-10 22:05:42.090: E/ActivityThread(1917):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
11-10 22:05:42.090: E/ActivityThread(1917):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
11-10 22:05:42.090: E/ActivityThread(1917):  at dalvik.system.NativeStart.main(Native Method) 

Tworzę nowy projekt, aby pokazać, co się dzieje.

Można go znaleźć na http://xp-dev.com/svn/RecreateError/trunk/

Nie wiem, co moja wina, ale zacznę aktywny i zalogować cyklem aktywności użytkownika. Rezultat:

11-10 22:26:45.960: I/seasons log(2274): onCreate() 
11-10 22:26:45.990: I/seasons log(2274): onStart() 
11-10 22:26:45.990: I/seasons log(2274): onResume() 

Teraz naciśnij Action Bar Ikona aktywować flagę odtworzyć i przejść do innej aplikacji ...

11-10 22:30:26.390: I/seasons log(2274): onPause() 
11-10 22:30:27.080: I/seasons log(2274): onStop() 

i powrócić do mojej działalności z flagą odtworzyć aktywowanym co będzie zrobione restoreate() w onResume().

11-10 22:33:05.500: I/seasons log(2274): onCreate() 
11-10 22:33:05.510: I/seasons log(2274): onStart() 
11-10 22:33:05.510: I/seasons log(2274): onResume() 
11-10 22:33:05.510: I/seasons log(2274): onPause() 

onPause? Ale moja aktywność jest widoczna, co robię źle? Poprawny status to nie onResume()?

A teraz, gdy zmienię na inną aplikację, pojawia się błąd.

Dziękuję za poświęcony czas i przepraszam za mój zły angielski.


W tej chwili nie rozumiem, jak aplikacje takie jak File Manager HD wykonują tę akcję.

Dwie czynności: Główna aktywność A, aktywność B z PreferenceFragment jako główną treść.

Jedną z opcji, która zmienia motyw pomiędzy Holo i Holo.Light, zmiany Działalność B o OnSharedPreferenceChangeListener metody w PreferenceFragment ale kiedy wrócimy do głównej działalności recreate() sposobu na onResume() nie powiedzie się, jak to zrobić?

Jestem zakłopotany. Przepraszam.

Odpowiedz

0

Nie wiem, czy to jest przyczyną twoich problemów, ale nie porównuj takich łańcuchów w Javie;

protected void onResume() { 
    ... 
    if (recreate == "S") { 
     recreate = "N"; 
     recreate(); 
    } 

Zamiast tego należy użyć if ("S".equals(recreate)).

+0

UPS. W prawdziwej aplikacji ten kod nie istnieje, ale dziękuję. Wielki błąd dla mnie. – seasonsend

0

Nie należy nigdy dzwonić pod numer onPause onCreate onResume itp. Nie powinieneś używać recreate() dla tego, co chcesz zrobić, umieścić kod inicjalizacyjny w innym miejscu, jeśli wymaga on aktualizacji. Ponadto użyj liczby całkowitej, aby zapisać stan programu zamiast łańcucha, a następnie zadeklaruj niektóre zmienne końcowe do odwołania, np.

public final int RECREATE_ON = 1; 
public final int RECREATE_OFF = 2; 
private int recreate = RECREATE_OFF; 

... 

if(recreate==RECREATE_ON){ 
    recreate(); 
} 

Pamiętaj, co odtworzyć() robi:

Przyczyna tej działalności mają być odtworzone z nowej instancji.Wynik ten jest następujący: w zasadniczo takim samym strumieniu, jak w przypadku utworzenia działania z powodu zmiany konfiguracji - bieżące wystąpienie przejdzie przez swój cykl życia do onDestroy() i następnie zostanie utworzone nowe wystąpienie.

Dlatego właśnie otrzymujesz wiadomość o .

+1

Nie wzywam onPause, onCreate, onResume na własną rękę. Ale masz rację, odtwarzaj. Używam tego w mojej aplikacji, ponieważ na PreferenceFragment zmieniam temat pomiędzy holo i Holo.light i muszę odtworzyć działanie po powrocie, aby zobaczyć zmiany. – seasonsend

+1

Myślę, że nie powinieneś decydować, czego potrzebują inni ludzie. Jeśli nie znasz rozwiązania, po prostu nie odpowiadaj. – Michael

3

Aby to zrobić, należy użyć Handler:

Handler handler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      if(msg.what==MSG_RECREATE) 
       recreate(); 
     } 
}; 

@Override 
protected void onResume() { 
    if(condition) { 
     Message msg = handler.obtainMessage(); 
     msg.what = MSG_RECREATE; 
     handler.sendMessage(msg); 
    } 
} 

To nie padnie już.

+4

Wierzę, że nadal będzie się zawieszał, jeśli nie nazwiesz 'super.onResume()' :) – nicopico

Powiązane problemy