Подтвердить что ты не робот

Как вызвать простой метод GET с помощью функции "Дооснащение"

Было бы неплохо, если бы вы помогли мне вызвать простой метод API GET с помощью Retrofit. Я добавил файл сборки Gon и Retrofit в путь сборки.

Вот interface:

  public interface MyInterface {
        @GET("/my_api/shop_list")
        Response getMyThing(@Query("mid") String param1);
    }

Я получаю только результаты (в log cat), если я вызываю следующее в AsyncTask else, я получаю NetworkOrMainThreadException Как мне это назвать?

@Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub

        RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint("http://IP:Port/")
                .setLogLevel(RestAdapter.LogLevel.FULL).build();
        MyInterface service = restAdapter
                .create(MyInterface.class);
        mResponse = service.getMyThing("455744");

        return null;
    }
  • Неужели мне нужно вызвать Restadapter в AsyncTask?
  • Как я могу получить JsonObject из ответа?
4b9b3361

Ответ 1

Дооснащение дает вам возможность синхронного и асинхронного. В зависимости от того, как вы объявляете свой метод интерфейса, он будет либо синхронным, либо асинхронным.

public interface MyInterface {
    // Synchronous declaration
    @GET("/my_api/shop_list") 
    Response getMyThing1(@Query("mid") String param1);

    // Asynchronous declaration
    @GET("/my_api/shop_list")
    void getMyThing2(@Query("mid") String param1, Callback<Response> callback);
}

Если вы объявите свой API синхронно, вы будете ответственны за его выполнение в Thread.

Пожалуйста, прочитайте раздел "СИНХРОННОЕ VS. ASYNCHRONOUS VS. OBSERVABLE" на веб-сайте Retrofit . Это объяснит вам основы того, как объявить ваши API для ваших различных потребностей.

Самый простой способ получить доступ к вашему объекту класса JSON - это сопоставить его с объектом Java и позволить Retrofit выполнить преобразование для вас.

Если, например, возвращенный JSON для вашего отдыха api был

[{"id":1, "name":"item1"}, {"id":2, "name":"item2"}]

Тогда вы могли бы создать классы Java, например,

public class Item {
    public final int id;
    public final String name;

    public Item(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

Затем просто объявите свой api таким образом

@GET("/my_api/shop_list")
void getMyThing(@Query("mid") String param1, Callback<List<Item>> callback);  // Asynchronous

И используйте его

api.getMyThing("your_param_here", new Callback<List<Item>>() {
        @Override
        public void success(List<Item> shopList, Response response) {
            // accecss the items from you shop list here
        }

        @Override
        public void failure(RetrofitError error) {

        }
    });

Основываясь на JSON, который вы указали в комментариях, которые вы могли бы сделать, например:

public class MyThingResponse {
    public InnerResponse response;
}

public class InnerResponse {
    public String message;
    public String status;
    public List<Item> shop_list;
}

Это отвратительно, но из-за JSON. Моя рекомендация состояла в том, чтобы упростить ваш JSON, удалив внутренний "ответ", если вы можете, например,

{
    "message": "Shops shown",
    "status": 1,
    "shop_list": [
        {
            "id": "1",
            "city_id": "1",
            "city_name": "cbe",
            "store_name": "s"
        }
    ]
}

Тогда ваш POJO мог бы стать таким простым

public class MyThingResponse {
    public String message;
    public String status;
    public List<Item> shop_list;
}