Как вернуть объект из get-вызова retrofit api

#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
     }
});