вылетает приложение с сетевым запросом
если я делаю так, то приложение вылетает после нажатия на кнопку
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 шт):
Попробуйте использовать данный код:
runOnUiThread(new Runnable() {
@Override
public void run() {
databaseHelper = new DatabaseHelper(getApplicationContext());
}
});
Оберните им тот кусок кода на который указывает лог. Вот подобное обсуждение.
Коллбэк запроса в 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);
}
});
}
});