То, как вы выполняете вызов 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
}
});