Ошибка в модификации GET-запроса в Android

android retrofit retrofit2

1152 просмотра

4 ответа

Я занимаюсь разработкой приложения для Android. В моем приложении я использую сетевую библиотеку Retrofit для соединения с сервером. Это мой самый первый раз использования модернизации. До того как я использовал волейбол. Поэтому, прежде чем использовать модификацию в реальном проекте, я тестирую его, выполняя простой запрос get на сервер.

Я установил модификацию в Gradle

compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'

Я создал интерфейс для запроса на модернизацию

public interface RetrofitService {
    @GET("test")
    Call<ChildCategoryItem> repoContributors();

    public static final Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(LinkConfig.API_END_POINT)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
}

Я сделал запрос в деятельности, как это

 private void makeRetrofitRequest()
    {
        try{
            RetrofitService service = RetrofitService.retrofit.create(RetrofitService.class);
            Call<ChildCategoryItem> call = service.repoContributors();
            String result = call.execute().body().toString();
            Toast.makeText(getBaseContext(),result,Toast.LENGTH_SHORT).show();
        }
        catch (IOException e)
        {
            Toast.makeText(getBaseContext(),"Exception",Toast.LENGTH_SHORT).show();
        }
    }

Сервер возвращает эти данные JSON

{"id":1,"name":"name","mm_name":"mm_name"}

Это мой класс ChildCategoryItem

public class ChildCategoryItem {
    private int Id;
    private String Name;
    private String MmName;
    private int ParentId;

    public void setId(int id)
    {
        this.Id = id;
    }
    public int getId()
    {
        return this.Id;
    }
    public void setName(String name)
    {
        this.Name = name;
    }
    public String getName()
    {
        return this.Name;
    }
    public void setMmName(String mmName)
    {
        this.MmName = mmName;
    }
    public String getMmName()
    {
        return this.MmName;
    }
    public void setParentId(int id)
    {
        this.ParentId = id;
    }
    public int getParentId()
    {
        return this.ParentId;
    }


    public static ChildCategoryItem fromJson(JSONObject json)
    {
        try{
            ChildCategoryItem item = new ChildCategoryItem();
            item.setId(json.getInt("id"));
            item.setName(json.getString("name"));
            item.setMmName(json.getString("mm_name"));
            return item;
        }
        catch (JSONException e)
        {
            return null;
        }
    }
}

Когда я бегу, это дает мне эту ошибку

08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime: FATAL EXCEPTION: main
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{mmbookhub.com.mmbookhub/mmbookhub.com.mmbookhub.ContributeActivity}: android.os.NetworkOnMainThreadException
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at android.app.ActivityThread.access$600(ActivityThread.java:141)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:99)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:137)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5103)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:525)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at dalvik.system.NativeStart.main(Native Method)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:  Caused by: android.os.NetworkOnMainThreadException
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at libcore.io.IoBridge.connectErrno(IoBridge.java:144)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at libcore.io.IoBridge.connect(IoBridge.java:112)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at java.net.Socket.connect(Socket.java:842)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at okhttp3.internal.AndroidPlatform.connectSocket(AndroidPlatform.java:55)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at okhttp3.internal.io.RealConnection.connectSocket(RealConnection.java:185)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at okhttp3.internal.io.RealConnection.buildConnection(RealConnection.java:170)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at okhttp3.internal.io.RealConnection.connect(RealConnection.java:111)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at okhttp3.internal.http.StreamAllocation.findConnection(StreamAllocation.java:187)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at okhttp3.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:123)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at okhttp3.internal.http.StreamAllocation.newStream(StreamAllocation.java:93)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at okhttp3.internal.http.HttpEngine.connect(HttpEngine.java:296)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at okhttp3.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at okhttp3.RealCall.getResponse(RealCall.java:243)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:201)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:163)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at okhttp3.RealCall.execute(RealCall.java:57)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at retrofit2.OkHttpCall.execute(OkHttpCall.java:174)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.execute(ExecutorCallAdapterFactory.java:89)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at mmbookhub.com.mmbookhub.ContributeActivity.makeRetrofitRequest(ContributeActivity.java:505)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at mmbookhub.com.mmbookhub.ContributeActivity.onCreate(ContributeActivity.java:84)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at android.app.Activity.performCreate(Activity.java:5133)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at android.app.ActivityThread.access$600(ActivityThread.java:141) 
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:99) 
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:137) 
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5103) 
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method) 
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:525) 
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
08-20 05:24:41.195 1341-1341/mmbookhub.com.mmbookhub E/AndroidRuntime:     at dalvik.system.NativeStart.main(Native Method) 
08-20 05:24:41.231 398-410/system_process W/ActivityManager:   Force finishing activity mmbookhub.com.mmbookhub/.ContributeActivity
08-20 05:24:41.231 398-410/system_process W/ActivityManager:   Force finishing activity mmbookhub.com.mmbookhub/.MainActivity

Что не так с моим кодом? Это то, как я правильно делаю запрос?

Автор: Wai Yan Hein Источник Размещён: 08.11.2019 11:07

Ответы (4)


1 плюс

Решение

У вас есть 2 варианта:

  1. Положите свой вызов API внутри отдельного Thread

    String result = call.execute().body().toString(); //put this inside seperate Thread
    
  2. Использование enqueue()модернизации.

    call.enqueue(new Callback<ChildCategoryItem>() {
        @Override
        public void onResponse(Call<ChildCategoryItem> call, Response<ChildCategoryItem> response) {
               //Here you will get your response.
        }
    
        @Override
        public void onFailure(Call<ChildCategoryItem> call, Throwable t) {
             t.printStackTrace();
        }
    });
    

Вы должны проверить это дляNetworkOnMainThreadException

Автор: Ravi Rupareliya Размещён: 20.08.2016 09:43

1 плюс

ошибка произошла из-за того, что android не поддерживает сеть в главном потоке, вы можете решить ее, поместив свой сетевой вызов в новый поток

или используйте метод ниже для вашего случая

 call.enqueue(new Callback<ChildCategoryItem>() {
        @Override
        public void onResponse(Call<ChildCategoryItem> call, Response<ChildCategoryItem> response) {

        }

        @Override
        public void onFailure(Call<ChildCategoryItem> call, Throwable t) {
             t.printStackTrace();
        }
    });
Автор: Manthan Patel Размещён: 20.08.2016 09:41

1 плюс

Вместо call.execute () используйте call.enqueue () для выполнения асинхронного запроса. (кроме пользовательского интерфейса). execute () - синхронный вызов выполнения в том же потоке, т.е. в потоке пользовательского интерфейса.

Автор: Ramit Размещён: 20.08.2016 09:51

1 плюс

Как отметил Виктор Якунин, вам следует перейти по следующей ссылке, поскольку основная проблема заключается в том, чтобы сделать сетевой вызов без потока пользовательского интерфейса.

Как исправить android.os.NetworkOnMainThreadException?

Согласно документации по модернизации

Экземпляры вызова могут выполняться либо синхронно, либо асинхронно. Каждый экземпляр можно использовать только один раз, но вызов clone () создаст новый экземпляр, который можно использовать.

На Android обратные вызовы будут выполняться в главном потоке. В JVM обратные вызовы будут происходить в том же потоке, который выполнил HTTP-запрос.

Для синхронного вызова мы используем

call.execute

Для асинхронного вызова мы используем

call.enqueue

Я не использовал залп, но если вы начинаете с модернизации, я предлагаю вам пройти через это:

Использование API с Retrofit

Для вашей программы это самый простой метод:

ChildCategoryItem.java

public class ChildCategoryItem
{
@SerializedName("id")
@Expose
private String id;
@SerializedName("name")
@Expose
private String name;
@SerializedName("mm_name")
@Expose
private String mmName;

/**
 * @return The id
 **/
public String getId()
{
    return id;
}

/**
 * @param id The id
 **/
public void setId(String id)
{
    this.id = id;
}

 /**
 * @return The name
 **/
public String getName()
{
    return name;
}

/**
 * @param name The name
 **/
public void setName(String name)
{
    this.name = name;
}

/**
 * @return The mmName
 **/
public String getMmName()
{
    return mmName;
}

/**
 * @param mmName The mm_name
**/
public void setMmName(String mmName)
{
    this.mmName = mmName;
}
}

MainActivity.java

public class MainActivity extends AppCompatActivity
{

    String result;
    doRetrofit DD;
    Call<ChildCategoryItem> call;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DD= new doRetrofit();
        DD.execute();
    }

    public class doRetrofit extends AsyncTask
    {
        @Override
        protected Object doInBackground(Object[] objects)
        {
            String baseurl="http://192.168.1.12";
            Retrofit adapter= new Retrofit.Builder().baseUrl(baseurl).addConverterFactory(GsonConverterFactory.create()).build();
            RetrofitService retrofitService=adapter.create(RetrofitService.class);
            Call<ChildCategoryItem> call=retrofitService.repoContributors();
            Response<ChildCategoryItem> c= null;
            try
            {
                c = call.execute();
            } catch (IOException e)
            {
                e.printStackTrace();
            }
            Log.d("<<<<<<<<<Response>>>>>>",c.body().toString());
            ChildCategoryItem child=c.body();
            Log.d("<<<<<<<<<Response>>>>>>",child.getId());
            Log.d("<<<<<<<<<Response>>>>>>",child.getName());
            Log.d("<<<<<<<<<Response>>>>>>",child.getMmName());

            return null;
        }
    }
}

RetrofitService.java

public interface RetrofitService
{
    @GET("/loltry.php")
    Call<ChildCategoryItem> repoContributors();
}

Из любопытства, где и как вы используете метод Джонсона?

Надеюсь это поможет :)

Поскольку я не могу комментировать из-за отсутствия репутации, FYI: не использовать toast в рабочем потоке (то есть в Asynctask doInBackground), тост всегда должен использоваться с потоком пользовательского интерфейса. посмотри это:

Не удается создать обработчик внутри потока, который не вызвал Looper.prepare ()

Автор: Rushi M Thakker Размещён: 20.08.2016 11:03
Вопросы из категории :
32x32