Android:android.view.ViewRoot $ CalledFromWrongThreadException - 如何解决问题?

Nik*_*lin 5 layout multithreading android

我正在开发的应用程序正在与服务器通信,并且通信进程在其自己的线程中运行.有异步调用 - 例如login()和onLoginResponse().

在主活动中调用login(),并在主活动中处理响应(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");
    }
}
Run Code Online (Sandbox Code Playgroud)

当执行到达此方法时(从onLoginResponse()调用时)应用程序崩溃,日志显示以下消息:

android.view.ViewRoot $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图.

有没有人知道如何修改逻辑以便在修改布局和修复问题之前切换到适当的线程?

谢谢!

bha*_*982 17

试试Handler.

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;
       }
    }
};
Run Code Online (Sandbox Code Playgroud)