Una aplicación que estoy desarrollando actualmente se está comunicando con el servidor y el proceso de comunicación se ejecuta en su propio hilo. Hay llamadas asincrónicas, por ejemplo, login() y onLoginResponse().
Se llama a login() en la actividad principal y la respuesta se maneja también en la actividad principal (onLoginResponse()). En onLoginResponse() método no es el método updateGUIState() que modifica elementos de Presentación:
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");
}
}
Cuando la ejecución alcanza este método (cuando se llama desde onLoginResponse()) la aplicación se bloquea y el registro muestra el siguiente mensaje:
android.view.ViewRoot $ CalledFromWrongThreadException: Solo el hilo original que creó una jerarquía de vista puede tocar sus vistas.
¿Alguien sabe cómo es posible modificar la lógica para cambiar al hilo apropiado antes de modificar el diseño y solucionar el problema?
Gracias!
Ojalá encontrara esta respuesta hace mucho tiempo, tuve exactamente el mismo problema y tardé aproximadamente una semana en encontrar la solución, que es exactamente lo que mencionó – aryaxt
Encontré al menos 5 respuestas diferentes para esto excepción. ¡Solo este funcionó para mí! –