Асинхронные вызовы Android Okhttp
Я пытаюсь использовать библиотеку Okhttp для подключения моего приложения android к моему серверу через API.
мой вызов api происходит при нажатии кнопки, и я получаю следующее android.ОС.NetworkOnMainThreadException. Я понимаю, что это связано с тем, что я пытаюсь выполнить сетевые вызовы в основном потоке, но я также пытаюсь найти чистое решение на android о том, как заставить этот код использовать другой поток (асинхронные вызовы).
@Override
public void onClick(View v) {
switch (v.getId()){
//if login button is clicked
case R.id.btLogin:
try {
String getResponse = doGetRequest("http://myurl/api/");
} catch (IOException e) {
e.printStackTrace();
}
break;
}
}
String doGetRequest(String url) throws IOException{
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
выше мой код, и исключение выбрасывается на строку
Response response = client.newCall(request).execute();
Ive также прочитал, что Okhhtp поддерживает асинхронные запросы, но я действительно не могу найти чистое решение для android, поскольку большинство, похоже, используют новый класс, который использует AsyncTask??
любая помощь или предложения будут высоко ценится, спасибо...
1 ответов
чтобы отправить асинхронный запрос, используйте следующее:
void doGetRequest(String url) throws IOException{
Request request = new Request.Builder()
.url(url)
.build();
client.newCall(request)
.enqueue(new Callback() {
@Override
public void onFailure(final Call call, IOException e) {
// Error
runOnUiThread(new Runnable() {
@Override
public void run() {
// For the example, you can show an error dialog or a toast
// on the main UI thread
}
});
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
String res = response.body().string();
// Do something with the response
}
});
}
& называю это так:
case R.id.btLogin:
try {
doGetRequest("http://myurl/api/");
} catch (IOException e) {
e.printStackTrace();
}
break;