読者です 読者をやめる 読者になる 読者になる

【Android】android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Android

 

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

 

<原因>

ワーカースレッドでUIの操作を行うと発生します。

 

<対策>

※okhttpでの例です

Request request = new Request.Builder().url("★url").build();
OkHttpClient client = new OkHttpClient();

client.newCall(request).enqueue(new Callback() {
  @Override
  public void onFailure(Call call, IOException e) {
    //失敗の場合の処理
  }
  @Override

  public void onResponse(Call call, Response response) throws IOException {

    //ここでUIの操作を行うと発生します(CalledFromWrongThreadException)
    String result = response.body().string();
    resultEdit(result);

  }

});

//コールバックのonResponse()はワーカースレッドで実行されるため
//UI操作を行うとCalledFromWrongThreadExceptionが発生
//そのため ActivityのrunOnUIThread()などで実行

private void resultEdit(final String result) {
  runOnUiThread(new Runnable() {
    @Override
    public void run() {
      textView1.setText(result);★ここでUIの操作を行えばエラーになりません
    }
  });
}