Получить значения с помощью метода обратного вызова для другого класса в Android-дооснащение
Я пытаюсь получить данные, которые я анализирую из метода 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 ответа
//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
}
Похоже, у вас есть циклическая ссылка здесь. Радиосвязь вызывает запуск ApiClient, который запускает сетевой запрос, который вызывает Radio.setChannels, который снова пытается вызвать клиента.
Я думаю, вам нужно решить две вещи:
- Избегайте этой циклической ссылки
- Вы передаете
listener
вApiClient.start()
но вы никогда не назначаете его фактическому значению внутриApiClient
, Итак, я думаю, что вы получите NPE здесь, если у вас есть успешный ответ.