Получить значения с помощью метода обратного вызова для другого класса в Android-дооснащение - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь получить данные, которые я анализирую, из метода onResponse через Callback.Вот мой ApiClient:

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


    private ChannelCallback listener;

    static final String BASE_URL = "https://www.radyoodtu.com.tr/";

    public void start(ChannelCallback 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);

    }

    @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);
            List<Channel> channels = new ArrayList<>(body.values());
            for (Channel channel : body.values()) {
                System.out.println(channel.getSong());
            }
        }

    }

    @Override
    public void onFailure(retrofit2.Call<Map<String, Channel>> call, Throwable t) {
        //TODO
    }
}

и это класс, который я пытаюсь получить данные:

public class Radio implements ChannelCallback {

    private ApiClient apiClient = new ApiClient();


    public Radio(){
        apiClient.start(this);
    }


    @Override
    public void setChannels(Map<String, Channel> body) {
        this.apiClient.onResponse(body); // NOT WORKING
    }
}

вот мой интерфейс:

public interface ChannelCallback {

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

мне нужно получить данные тела onResponse для класса Radio, который я сейчас использую.В классе Radio мне нужно создать Список объектов каналов с теми данными, которые мне нужны, но я даже не могу получить данные, поэтому я даже не могу создать этот список.Я вообще не знаю, как манипулировать данными из слушателя, и я не знаю, как мне получить доступ к тому слушателю, которого я использую в ApiClient в классе Radio.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018
//i think no need to impliments ChannelCallback if this code works
//just asign your interface and apiclient in class
public class Radio implements ChannelCallback {
private ApiClient apiClient = new ApiClient();
private ChannelCallback channelCallback;

and in inside radio()
public Radio(){
apiClient.start(this);
channelCallback = apiClient.onResponse(body).create(ChannelCallback.class);
channelCallback.setChannels(Map<String, Channel> body)
}

//and recieve callback 
}
0 голосов
/ 20 декабря 2018

Похоже, у вас есть циклическая ссылка здесь.Радиосвязь вызывает запуск ApiClient, который запускает сетевой запрос, который вызывает Radio.setChannels, который пытается снова вызвать клиента .

Я думаю, вам нужно решить две вещи:

  1. Избегайте этой циклической ссылки
  2. Вы передаете listener в ApiClient.start(), но никогда не присваиваете его фактическому значению внутри ApiClient.Итак, я думаю, что вы получите NPE здесь, если у вас есть успешный ответ.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...