Aplikacja, którą właśnie rozwijam, komunikuje się z serwerem, a proces komunikacji przebiega we własnym wątku. Są wywołania asynchroniczne - na przykład login() i onLoginResponse().
Funkcja login() jest wywoływana w głównej aktywności, a odpowiedź jest obsługiwana również w działaniu głównym (onLoginResponse()). W metodzie onLoginResponse() istnieje updateGUIState() metoda, która modyfikuje elementy układu:
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");
}
}
Gdy wykonanie osiągnie ten sposób (po nazwie od onLoginResponse()) awarii aplikacji i dziennik wyświetla się następujący komunikat:
android.view.ViewRoot $ CalledFromWrongThreadException: Tylko oryginalny wątek, który utworzył hierarchię widoku, może dotykać swoich widoków.
Czy ktoś wie, jak można zmienić logikę, aby przełączyć się na odpowiedni wątek przed zmodyfikowaniem układu i naprawieniem problemu?
Dzięki!
Chciałbym znaleźć tę odpowiedź przez długi czas, miałem dokładnie ten sam problem i zajęło mi około tygodnia, aby znaleźć rozwiązanie, które jest dokładnie tym, co wspomniałeś – aryaxt
Znalazłem co najmniej 5 różnych odpowiedzi dla tego wyjątek. Tylko ten pracował dla mnie! –