2011-11-10 9 views
10

Ho un progetto per HoneyComb e viene visualizzato un errore dopo l'uso del metodo recreate() nel metodo onResum() nella mia attività principale.esecuzione della pausa dell'attività che non viene ripresa dopo il metodo di ripetizione

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) 

Ho creato un nuovo progetto per mostrarvi cosa succede.

Lo si può trovare in http://xp-dev.com/svn/RecreateError/trunk/

Non so che cosa è colpa mia, ma mi metto attività e accedere ciclo di vita del Activity. Il risultato:

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() 

Ora premere il tasto azione barra icona per attivare la bandiera Ricrea e passare ad altre app ...

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

e tornare alla mia attività con la bandiera ricreare attivato cosa fatta recreate() a 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? Ma la mia attività è visibile, cosa sto facendo male? Lo stato corretto non è onResume()?

E ora se cambio a un'altra app ottengo l'errore.

Grazie per il vostro tempo e mi dispiace per il mio pessimo inglese.


In questo momento non capisco come applicazioni come File Manager HD eseguono questa azione.

Due attività: Attività principale A, Attività B con PreferenceFragment come contenuto principale.

Una possibilità che cambia tema tra Holo e Holo.Light, cambiamenti Attività B con un metodo OnSharedPreferenceChangeListener in PreferenceFragment ma quando torneremo al metodo Main Activity recreate() a onResume() fallisce, come fare questo?

Sono confuso. Scusate.

risposta

0

Non so se questa è la causa dei tuoi problemi ma non confronti Archi come questo in Java;

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

Utilizzare invece if ("S".equals(recreate)).

+0

Ups. Nella vera app questo codice non esiste ma grazie. Un grande errore per me. – seasonsend

0

Non si dovrebbe mai chiamare onPause onCreate onResume per conto proprio. Non è necessario utilizzare recreate() per ciò che si vuole fare, inserire il codice di inizializzazione altrove se è necessario aggiornarlo. Inoltre, utilizzare un numero intero per memorizzare lo stato del programma anziché una stringa, quindi dichiarare alcune variabili finali a cui fare riferimento, ad es.

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

... 

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

Ricordate ciò che Ricrea() sta facendo:

Causa questa attività per essere ricreata con una nuova istanza.Ciò risulta essenzialmente nello stesso flusso di quando viene creata l'attività a causa di una modifica di configurazione - l'istanza attuale passa attraverso il suo ciclo di vita a onDestroy() e una nuova istanza creata successivamente.

Ecco perché ricevi il messaggio .

+1

Non chiamo suPause, onCreate, onResume per conto mio. Ma hai ragione con ricreare. Lo uso nella mia app perché su un PreferenceFragment cambio il tema tra holo e Holo.light e devo ricreare l'attività quando torno a vedere i cambiamenti. – seasonsend

+1

Penso che non dovresti decidere di quali altre persone hanno bisogno. Se non conosci una soluzione, non rispondere. – Michael

3

Per fare questo, utilizzare un gestore:

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); 
    } 
} 

Questo non andrà in crash più.

+4

Credo che andrà ancora in crash, se non chiami 'super.onResume()' :) – nicopico

Problemi correlati