Retrofit 2 onResponse заполнить объект в другом классе - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь использовать значения, полученные из моего запроса, но не могу их использовать, потому что void onReponse метод.Значения, которые я получаю, остаются только в методе onResponse.Я знаю, что это потому, что это void, и я ничего не могу вернуть, но есть ли способ заполнить объект полученными значениями?

Вот мой класс ApiClient:

public class ApiClient implements Callback<Map<String, Channel>> {

static final String BASE_URL = "some url";

public void start() {
    Gson gson = new GsonBuilder()
            .setLenient()
            .create();

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build();

    RestInterface restInterface = retrofit.create(RestInterface.class);

    Call<Map<String, Channel>> call = restInterface.getChannels();
    call.enqueue(this);

}

@Override
public void onResponse(retrofit2.Call<Map<String, Channel>> call, Response<Map<String, Channel>> response) {
    System.out.println(response.code());
    if(response.isSuccessful()) {
        Map<String, Channel> body = response.body();
        List<Channel> channels = new ArrayList<>(body.values());
        for (Channel channel : body.values()) {
            System.out.println(channel.getSong());
        }
...

Что мне нужно сделать, это создать объекты Channel со значениями, которые я получаю из onResponse.Я пытался использовать его в другом классе, как это:

    ApiClient apiClient = new ApiClient();

    apiClient.start();

, но он все еще работает только в onResponse.Мне нужно создать объекты Channel, такие как:

Channel channel = new Channel(channels(1));

это, но в другом классе, не в ApiClient.

1 Ответ

0 голосов
/ 19 декабря 2018

Используйте интерфейс обратного вызова для передачи данных в другой класс:

public interface ChannelCallback {

    void setChannels(Map<String, Channel> body);
}

В вашем слушателе назначения ApiClient:

private ChannelCallback listener;

public void start(ChannelCallback listener) {

    this.listener = listener;

    Gson gson = new GsonBuilder()
        .setLenient()
        .create();

    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build();

    RestInterface restInterface = retrofit.create(RestInterface.class);

    Call<Map<String, Channel>> call = restInterface.getChannels();
    call.enqueue(this);

}

В OnResponse передайте данные через этого слушателя:

@Override
public void onResponse(retrofit2.Call<Map<String, Channel>> call, 
Response<Map<String, Channel>> response) {
    System.out.println(response.code());
    if(response.isSuccessful()) {
        Map<String, Channel> body = response.body();
        listener.setChannels(body);
}

Не забудьте реализовать прослушиватель ChannelCallback в классе, который вызывает ApiClient.start (this)

public SomeClass implements ChannelCallback{

    ...

    apiClient.start(this);

    ...

    @Override
    setChannels(Map<String, Channel> body){
    // logic here with data from body
    }

   ...

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...