@morotkin

В чем причина ошибки при синхронном запросе Retrofit 2?

Всем привет!

Описание запроса к API:
public interface APIv1 {

    @Multipart
    @POST("/api/v1/order/create")
    Call<ResponseBody> SendOrder(@PartMap Map<String, RequestBody> params);

}


При асинхронном выполнении запроса все нормально работает:
call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {

                if (response.isSuccessful()) {
                    Map<String, String> map = gson.fromJson(response.body().toString(), Map.class);

                    for (Map.Entry e : map.entrySet()) {
                        System.out.println(e.getKey() + " " + e.getValue());
                        Log.e("Delivery message:", e.getKey() + " " + e.getValue());
                    }

                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                Log.e("Upload error:", t.getMessage());
            }
        });


Но при попытке выполнить запрос синхронно:
try {
            retrofit2.Response<ResponseBody> response = call.execute();

            if(response.isSuccessful()) {
                
                return true;
            }


        } catch (IOException e) {
            e.printStackTrace();
        }


Приложение валится:
FATAL EXCEPTION: main
 Process: ru.serv_techno.delivery_st, PID: 3973
 android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1162)
at java.net.InetAddress.lookupHostByName(InetAddress.java:425)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:259)
at java.net.InetAddress.getAllByName(InetAddress.java:221)
at okhttp3.Dns$1.lookup(Dns.java:39)
at okhttp3.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:173)
at okhttp3.internal.http.RouteSelector.nextProxy(RouteSelector.java:139)
at okhttp3.internal.http.RouteSelector.next(RouteSelector.java:81)
at okhttp3.internal.http.StreamAllocation.findConnection(StreamAllocation.java:172)
at okhttp3.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:123)
at okhttp3.internal.http.StreamAllocation.newStream(StreamAllocation.java:93)
at okhttp3.internal.http.HttpEngine.connect(HttpEngine.java:296)
at okhttp3.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)
at okhttp3.RealCall.getResponse(RealCall.java:243)
at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:201)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:163)
at okhttp3.RealCall.execute(RealCall.java:57)
at retrofit2.OkHttpCall.execute(OkHttpCall.java:174)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.execute(ExecutorCallAdapterFactory.java:89)
at ru.serv_techno.delivery_st.MyOrder.sendOrder(MyOrder.java:154)
at ru.serv_techno.delivery_st.BoxActivity.CreateOrder(BoxActivity.java:170)
at ru.serv_techno.delivery_st.BoxActivity.doPositiveClick(BoxActivity.java:98)
at ru.serv_techno.delivery_st.MyAlert$2.onClick(MyAlert.java:45)
at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:157)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5674)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:963)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:758)


Подскажите, кто может в чем причина.
Спасибо!
  • Вопрос задан
  • 1112 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Всё же написано в стек трейсе. NetworkOnMainThreadException. Погуглить пробовал? В Андроиде нельзя ходить в сеть на главном потоке.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы