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

标签 android layout multithreading

我目前正在开发的一个应用程序正在与服务器通信,通信过程在它自己的线程中运行。有异步调用 - 例如 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/

相关文章:

android - 如何显示长文本只显示 1 行并附加

html - Css:如何使用底部填充使位置固定 100% 可调整大小? - 提供 JSFiddle

python - 通过 http 识别 python 线程(使用 django)

android - 解绑服务但不销毁它

android - 如何将 android 常量存储在 strings.xml 文件中?

html - 当我缩小和放大时,网站布局变得疯狂

C++ 多线程运行时问题

.net - IsBackground 对 .Net 线程的影响?

android - 通过使用计时器(或处理程序)更改 ImageView 中的图像来创建动画

android - Android 中路线的地理围栏