如何修复“android.view.ViewRootImpl $ CalledFromWrongThreadException”

时间:2014-12-03 09:08:15

标签: android multithreading

我想按如下方式修正错误:

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

这是我的代码。

公共类MainActivity扩展了Activity {

@SuppressLint("NewApi") @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);

    onShowMessage();
}

public void removeContent() {
    LinearLayout list = (LinearLayout) findViewById(R.id.linearlayout_list);
    list.removeAllViews();
}

public void onShowMessage() {
    Thread myThread = new Thread(new Runnable() {
        @Override
        public void run() {
            String id = "id1";
            String message = "message1";
            String response = HTTPUtils.HTTPPost(Global.MESSAGE_URL, 
                    "id", id, 
                    "message", message);
            process(response);
        }
    });
    myThread.start();
}

private void process(String response) {
    if (response == null || response.equals("")) {
        return;
    } else {
        try {
            JSONObject json = null;
            try {
                json = FbUtil.parseJson(response);
            } catch (FacebookError e) {
                showErrorMessage();
            }
            if (json.has("exception")) {
                showErrorMessage();
                return;
            } else {
                Global.list = JsonParser.getInfo(json);
                removeContent();
                initView();
                return;
            }
        } catch (JSONException e) {

        }
        return;
    }
}

}

removeContent();

发生

错误

请帮帮我。

1 个答案:

答案 0 :(得分:0)

您正在更新其他线程中的视图

removeContent(); initView();

在UI线程中调用这两个方法,如。

    runOnUiThread(new Runnable() {

        @Override
        public void run() {
            removeContent();
            initView();             
        }
    });