我目前正在开发的一个应用程序正在与服务器通信,通信过程在它自己的线程中运行。有异步调用 - 例如 login() 和 onLoginResponse()。
login() 在主 Activity 中调用,响应也在主 Activity 中处理 (onLoginResponse())。在 onLoginResponse() 方法中有 updateGUIState() 方法修改布局元素:
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");
}
}
当执行到此方法时(从 onLoginResponse() 调用时)应用程序崩溃并且日志显示以下消息:
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
有谁知道如何修改逻辑以便在修改布局之前切换到适当的线程并解决问题?
谢谢!
最佳答案
尝试处理程序
。
onLoginResponse()
是回调函数吗?
如果是,可以通过Handler解决问题。
在onLoginResponse()
中,
hRefresh.sendEmptyMessage(REFRESH);
Handler hRefresh = new Handler(){
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case REFRESH:
/*Refresh UI*/
updateGUIState();
break;
}
}
};
关于Android:android.view.ViewRoot$CalledFromWrongThreadException - 如何解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1536654/