Как вернуть объект из модифицированного api get call - PullRequest
0 голосов
/ 10 марта 2019

Я пытаюсь получить список объектов из вызова API с помощью модернизации, но я просто не могу найти способ сделать это :( Это функция, которую я построил:

 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() + "\n\n";

                textViewResult.append(content);
            }
            businessesList = businesses;
        }

        @Override
        public void onFailure(Call<List<Business>> call, Throwable t) {
            call.cancel();
            textViewResult.setText(t.getMessage());
        }
    });
}

Я пытаюсь получитьОтветы предприятий и их возврат. Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 14 марта 2019

То, как вы выполняете вызов Retrofit, является асинхронным - с использованием 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
     }
});
...