简体   繁体   中英

Android Studio Retrofit OnResponse Problem

Im working on mvvm design but OnResponse is not saving the data in List. İts returning the emtpy List array. I cant reach the valued List. I realy dont know where is the incorrect piece of code. Here is the code.Help please.

public class RetroClass {

     private static final String BASE_URL="--";

        private List<ProductModel> productList=new ArrayList<>();

        public static Retrofit getRetroInstance(){

            return new Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create()).build();
        }

        public static APIService getAPIService(){

            return getRetroInstance().create(APIService.class);
        }

        public List<ProductModel> getProducts(){

            APIService apiService=getAPIService();

            apiService.getProducts().enqueue(new Callback<List<ProductModel>>() {
                @Override
                public void onResponse(Call<List<ProductModel>> call, Response<List<ProductModel>> response) {

                    productList.addAll(response.body());
                    for (int k=0;k<productList.size();k++) {
                        Log.d("onResponse: ", productList.get(k).getOrderName());//im getting the value here
                    }
                }

                @Override
                public void onFailure(Call<List<ProductModel>> call, Throwable t) {
                    Log.d("onFailure: ",t.getMessage());

                }
            });
            return productList;//but this is empty

        }

    }

Here is my view model.

public class ProductsVievModal extends ViewModel {

        List<ProductModel> productList;
        LiveData<List<ProductModel>> liveproductList;
        RetroClass apiClass=new RetroClass();

        public List<ProductModel> getProducts(){

            productList=apiClass.getProducts();
            for (int k=0;k<productList.size();k++) {
                Log.d("onResponse: ", productList.get(k).getOrderName());
            }
            return productList;
        }

    }

.enqueue is asynchronously sending the request and notify callback of its response. It is asynchronous. onResponse() must complete before you return the product list.

I suspect the return productList; is executed before the onResponse() returned its value. Can you check by putting a log before return productList; to see which line is executed first?

Your data IS saved, but the moment your code needs it the.enqueue is probably not done retrieving the data yet. so it shows as empty

Easiest way to fix this is by having your follow up code in the onResponse so your basicly stuck waiting untill it either retrieved the information or failed

so something like this

public void onResponse(Call<List<ProductModel>> call, Response<List<ProductModel>> response) {
                    productList.addAll(response.body());

                    nextFunction();
                    }
                }

                @Override
                public void onFailure(Call<List<ProductModel>> call, Throwable t) {
                    Log.d("onFailure: ",t.getMessage());

                    failFunction();
                }
    ``` 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM