Я использую OKHttp выполнить Post запрос на сервер, как следует:Выполняют OkHttp сетевых действий в фоновом потоке
public class NetworkManager {
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
String post(String url, JSONObject json) throws IOException {
try {
JSONArray array = json.getJSONArray("d");
RequestBody body = new FormEncodingBuilder()
.add("m", json.getString("m"))
.add("d", array.toString())
.build();
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
} catch (JSONException jsone) {
return "ERROR: " + jsone.getMessage();
}
}
}
и называют его:
NetworkManager manager = new NetworkManager();
String response = manager.post("http://www.example.com/api/", jsonObject);
Когда я пытаюсь запустить приложение , он запрашивает ошибку в LogCat:
android.os.NetworkOnMainThreadException
на android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork (StrictMode.java:1273)
Со ссылкой на другие вопросы в SO, я добавил это переопределение политики:
if (android.os.Build.VERSION.SDK_INT > 9)
{
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
Но я подумайте, что это нездорово, и я хотел бы поместить действия NetworkManager
на фон. Как я могу это сделать?
Порекомендуйте асинхронную опцию OkHttp. – novak
Выглядит многообещающе. Как сообщить основному классу, когда ответ готов? Моя текущая логика является синхронной и напрямую возвращает строку ответа, затем основной класс анализирует ответ на дальнейшие действия. – Raptor
Как вы видите, внутри 'onResponse' вы это сделаете, если вы хотите обновить интерфейс или отобразить Toast, вам также понадобится' mHandler = new Handler (Looper.getMainLooper()); '. Если запрос внутри другого класса (например, Utils.java), я думаю, вы должны использовать интерфейс прослушивателя – BNK