9

Quindi ho uno strano problema, e non sono del tutto sicuro di tutte le informazioni che dovrei fornire, ma farò del mio meglio - fammi sapere se ho bisogno di aggiungere ulteriori informazioni. Sto avendo un problema che quando termino il mio Activity e torno al Activity precedente (o lo lancio con un nuovo Intent - il problema sembra essere centrato sul finire il Activity) le prestazioni dell'interfaccia utente scendono drasticamente per circa sei o sette secondi , quindi torna alla normalità.Timeout inattività attività per ActivityRecord

Da LogCat, questo avviso viene visualizzato in modo coerente:

07-11 22:09:42.594: W/ActivityManager(292): Launch timeout has expired, giving up wake lock! 
07-11 22:09:42.601: W/ActivityManager(292): Activity idle timeout for ActivityRecord{42bf6e00 com.kcoppock.sudokubeta/com.kcoppock.sudoku.SudokuBoardActivity} 

Non appena i tempi di attività fuori, ritorna prestazioni dell'interfaccia utente normale. Fino a quel momento è molto pigro. Non ho il codice di cui sono a conoscenza che potrebbe bloccare il thread principale, e sono persino arrivato al punto di commentare il mio intero metodo onPause() per vedere se fa alcuna differenza, e non lo fa.

Il Activity non genera alcun thread in background, non esegue alcuna attività di rete, l'unico accesso al disco che ha è un accesso di SharedPreferences. Le domande precedenti che sono riuscito a individuare riguardano i timeout di inattività per HistoryRecord, non ActivityRecord.

Qualche idea che cosa potrebbe causare questo? O come potrei decidere cosa sta bloccando il thread dell'interfaccia utente, se è quello che sta succedendo?

EDIT: Va bene, appena provato commentando tutto tranne super.onCreate() e setContentView() - il problema persiste. Non si verifica con altre attività ma questa, ma c'è la NULLA a questa. :/

+0

Tecnicamente è possibile bloccare il thread UI w/'SharedPreferences', ma credo che probabilmente non è probabile che, come un accesso alla rete o qualcosa del genere.Hai provato a rimuoverlo in qualche modo? –

+0

@AlexLockwood Grazie per l'idea. Ho appena provato questo; rimosso tutti i riferimenti a qualsiasi SharedPreferences, commentato il mio onPause() e onResume(), ma nessuna differenza. – kcoppock

+0

kcoppock vedi anche la mia domanda http://stackoverflow.com/questions/30053090/flash-toggle-button-crash-android – Nepster

risposta

12

Oh geez. Una di quelle cose che è piuttosto difficile da diagnosticare al di fuori di tentativi ed errori, ma l'ho capito. Per riferimento, se qualcun altro ha questo problema, è venuto giù per una visualizzazione personalizzata nel mio layout. Avevo aggiunto un ViewTreeObserver.OnGlobalLayoutListener() per apportare alcune modifiche al layout dopo il passaggio del layout, ma all'interno di quel listener ho modificato il layout e quindi causato un altro layout, essenzialmente creando un ciclo infinito (ma in qualche modo non causando un ANR). La mia soluzione era in questo modo:

private class BoardLayoutListener implements OnGlobalLayoutListener { 
    @Override 
    public void onGlobalLayout() { 
     //...do stuff here 

     //REMOVE this listener so that you don't repeat this forever 
     ViewTreeObserver obs = SudokuBoard.this.getViewTreeObserver(); 
     obs.removeGlobalOnLayoutListener(this); 
    } 
} 

Questa soluzione è abbastanza ironico, considerando la mia second highest rated answer on StackOverflow occupa specificamente con questo. : P

sospiro

+8

hahahah ... non preoccuparti, qualche settimana fa stavo leggendo le risposte su SO, e uno di loro è stato particolarmente illuminante quindi sono andato in suvote ... risulta che ho risposto alla domanda 1.5 anni fa e non ricordavo nulla: P –

+0

Haha, fantastico! : P – kcoppock

+1

Ecco perché non esiste AnR: https://groups.google.com/forum/?fromgroups=#!topic/android-developers/TfkPlN5b-ig (Grazie a Mother Dianne) – Reno

1

Ho avuto lo stesso problema di oggi, ma come si è scoperto avere una causa e soluzione diversa ho deciso di aggiungere le informazioni qui solo nel caso in cui potrebbe aiutare qualcun altro.
Nel mio caso problema è stato causato perché ho avuto la seguente riga dentro il mio metodo onActivityResult():
android.os.Debug.waitForDebugger();
Ho appena cancellato la linea e il problema era sparito. Questa riga viene in genere utilizzata per sincronizzare il debugger con i thread del sistema operativo, ma ho appena immaginato che non dovrebbe essere utilizzata da nessuna parte. Stranamente il problema non si presentava fino a quando il mio telefono non si disconnetteva dal desktop.

saluti

Problemi correlati