#api #get #retrofit2 #return-value #android-studio-2.0
#API #получить #retrofit2 #возвращаемое значение #android-studio-2.0
Вопрос:
Я пытаюсь получить список объектов из вызова api с помощью retrofit, но я просто не могу найти способ сделать это: (Это функция, которую я создал:
private List<Business> businesses getBusinesses()
{
List<Business> businessesList = new ArrayList<>();
Call<List<Business>> call = jsonPlaceHolderApi.getBusinesses();
call.enqueue(new Callback<List<Business>>() {
@Override
public void onResponse(Call<List<Business>> call, Response<List<Business>> response) {
if(!response.isSuccessful())
{
textViewResult.setText("Code: " response.code());
return;
}
List<Business> businesses = response.body();
for(Business business : businesses)
{
String content = "";
content = "ID: " business.getId() "n";
content = "Name: " business.getName() "n";
content = "On promotion: " business.isOnPromotion() "nn";
textViewResult.append(content);
}
businessesList = businesses;
}
@Override
public void onFailure(Call<List<Business>> call, Throwable t) {
call.cancel();
textViewResult.setText(t.getMessage());
}
});
}
Я пытаюсь получить ответ бизнеса и вернуть его.
кто-нибудь может мне помочь?
Чувствую разочарование: (
Ответ №1:
Способ выполнения модифицированного вызова является асинхронным с использованием call.enqueue
. в этом подходе нет ничего плохого. На самом деле это, пожалуй, лучший вариант, поскольку сетевые вызовы могут занимать некоторое время, и вы не хотите блокировать их без необходимости.
К сожалению, это означает, что вы не можете вернуть результат из функции. В большинстве сценариев, если бы вы это сделали, вызов, скорее всего, завершился бы после возврата, что сделало бы ваш возврат бесполезным.
Есть несколько способов справиться с этим, самый простой — использовать обратные вызовы. Например:
interface OnBusinessListReceivedCallback {
void onBusinessListReceived(List<Business> list);
}
private void businesses getBusinesses(OnBusinessListReceivedCallback callback){
Call<List<Business>> call = jsonPlaceHolderApi.getBusinesses();
call.enqueue(new Callback<List<Business>>() {
@Override
public void onResponse(Call<List<Business>> call, Response<List<Business>> response) {
if(!response.isSuccessful()){
textViewResult.setText("Code: " response.code());
return;
}
callback.onBusinessListReceived(response.body());
}
@Override
public void onFailure(Call<List<Business>> call, Throwable t) {
call.cancel();
textViewResult.setText(t.getMessage());
}
});
}
Затем вы можете вызвать его следующим образом:
getBusinesses(new OnBusinessListReceivedCallback() {
public void onBusinessListReceived(List<Business> list){
// list holds your data
}
});