Un'applicazione che sto attualmente sviluppando è in comunicazione con il server e il processo di comunicazione viene eseguito in una sua thread. Esistono chiamate asincrone, ad esempio login() e onLoginResponse().
login() viene chiamato nell'attività principale e la risposta viene gestita anche nell'attività principale (onLoginResponse()). In onLoginResponse() metodo c'è updateGUIState() metodo che modifica elementi tavola:
private void updateGUIState() {
Log.i(TAG, "executing updateGUIState");
arrangeLayoutElements();
txtTime.setText(mStrRecordingTime);
if (settings.isRecording()) {
//btnAction.setText("Stop");
btnAction.setImageResource(R.drawable.button_stop);
} else {
//btnAction.setText("Capture");
btnAction.setImageResource(R.drawable.button_record);
}
//set privacy level text
if (settings.getPrivacyLevel() == 0) {
txtPrivacyLevel.setText("Private");
} else if (settings.getPrivacyLevel() == 1) {
txtPrivacyLevel.setText("Public");
}
if (settings.isMute()) {
muteIcon.setIconImage(R.drawable.ic_volume_off_small);
} else {
muteIcon.setIconImage(R.drawable.ic_volume_small);
}
if (mIsUploading) {
txtUploadingText.setVisibility(View.VISIBLE);
uploadingProgressBar.setVisibility(View.VISIBLE);
} else {
txtUploadingText.setVisibility(View.INVISIBLE);
uploadingProgressBar.setVisibility(View.INVISIBLE);
}
if (mEncoderConnection != null) {
txtConnectionStatus.setText("Connected");
} else {
txtConnectionStatus.setText("Disconnected");
}
}
Quando l'esecuzione raggiunge questo metodo (quando chiamato da onLoginResponse()) l'applicazione si blocca e il registro visualizza il messaggio seguente:
android.view.ViewRoot $ CalledFromWrongThreadException: solo il thread originale che ha creato una gerarchia di viste può toccare le sue viste.
Qualcuno sa come è possibile modificare la logica per passare al thread appropriato prima di modificare il layout e risolvere il problema?
Grazie!
Vorrei aver trovato questa risposta a lungo, ho avuto lo stesso identico problema e mi ci sono voluti circa una settimana per capire la soluzione, che è esattamente quello che hai menzionato – aryaxt
Ho trovato almeno 5 risposte diverse per questo eccezione. Solo questo ha funzionato per me! –