вылетает приложение с сетевым запросом

если я делаю так, то приложение вылетает после нажатия на кнопку

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        get = (Button) findViewById(R.id.get);
        word = (EditText) findViewById(R.id.word);
        answer = (TextView) findViewById(R.id.answer);
        userList = (ListView)findViewById(R.id.list);
        get.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    getHttpResponse();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        userList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent(Main2Activity.this, Main3Activity.class);
                intent.putExtra("id", id);
                startActivity(intent);
            }
        });

        databaseHelper = new DatabaseHelper(getApplicationContext());
    }

Ошибка следующая: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. Как я понял это возникает из-за того, что сетевые запросы нужно делать в отдельном потоке. Только не пойму как разделить это.

Вот полный код ошибки:

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7512)
    at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1206)
    at android.view.View.requestLayout(View.java:22029)
    at android.view.View.requestLayout(View.java:22029)
    at android.view.View.requestLayout(View.java:22029)
    at android.view.View.requestLayout(View.java:22029)
    at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:360)
    at android.view.View.requestLayout(View.java:22029)
    at android.widget.TextView.checkForRelayout(TextView.java:8550)
    at android.widget.TextView.setText(TextView.java:5419)
    at android.widget.TextView.setText(TextView.java:5275)
    at android.widget.TextView.setText(TextView.java:5232)
    at com.example.myapplication.Main2Activity$3.onResponse(Main2Activity.java:111)
    at okhttp3.RealCall$AsyncCall.execute(RealCall.java:153)
    at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
    at java.lang.Thread.run(Thread.java:764)

Ответы (2 шт):

Автор решения: Andrew

Попробуйте использовать данный код:

runOnUiThread(new Runnable() {

    @Override
    public void run() {
       databaseHelper = new DatabaseHelper(getApplicationContext());

    }
});

Оберните им тот кусок кода на который указывает лог. Вот подобное обсуждение.

→ Ссылка
Автор решения: woesss

Коллбэк запроса в OkHttp вызывается в фоновом потоке, тогда как Андроид разрешает изменять UI только из UI-потока (о чём и говорит ошибка android.view.ViewRootImpl$CalledFromWrongThreadException).
Сделать это можно с помощью класса Handler, методов View.post(Runnable) и Activity.runOnUiThread(Runnable)

Пример вывода в TextView:

client.newCall(request).enqueue(new Callback() {
      @Override
      public void onFailure(Call call, IOException e) {
        textView.post(new Runnable() {
          @Override
          public void run() {
            textView.setText("Failure !");
          }
        });
      }

      @Override
      public void onResponse(Call call, final Response response) {
        String result;
        try { 
          result = response.body().string();
        } catch (IOException ioe) {
          result = "Error during get body";
        }
        textView.post(new Runnable() {
          @Override
          public void run() {
            textView.setText(result);
          }
        });
      }
});
→ Ссылка