Retrofit javobidan ob'ektlar ro'yxatini qaytarib bera olmaydi

Men ilovam uchun API qo'ng'iroqlarini amalga oshirish uchun qo'shimcha jihozlarni ishlataman. API uchun alohida funktsiyani yozdim, shundan foydalanish mumkin. Qaytib olgan javobim - "Filmlar" ob'ektining ro'yxati. Biroq, ob'ektni qaytarib bera olmaysiz. Bu erda nima qilishim kerak?

API dan olingan funksiya

  //These are the retrofit codes to get the data from TMDB API
    private List getDataFromServer(int page)
{
     ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);

    Call call = apiService.getPopularMovies(API_KEY , page);

    List movies = new ArrayList<>();

    call.enqueue(new Callback() {
        @Override
        public void onResponse(Call call, retrofit2.Response response) {
            movies = response.body().getMovies();
        }

        @Override
        public void onFailure(Call call, Throwable t) {
            Log.e(TAG,t.toString());
            movies = null;
        }
    });
     return movies;

}

Men filmlarni yakuniy deb e'lon qilishim kerak, lekin men buni qilsam, u avtomatik ravishda qator qatorni bir qatorga o'zgartiradi va onResponse ichidagi filmlarni o'zgartiradi va Failure moviessga aylantiriladi [0]. Men faqat kino olishni xohlayman, keyin esa uni ro'yxatga olishni xohlayman

1
Agar interfeys yarating va filmni olishni istasangiz, uni amalga oshiring.
qo'shib qo'ydi muallif Nongthonbam Tonthoi, manba
Agar interfeys yarating va filmni olishni istasangiz, uni amalga oshiring.
qo'shib qo'ydi muallif Nongthonbam Tonthoi, manba
kinolar ro'yxati ko'rinishi har doim bo'sh bo'lib qoladi, chunki siz onResponse da ma'lumotlarni qayta terish usuli sifatida o'rnatyapsiz.
qo'shib qo'ydi muallif ak sacha, manba

6 javoblar

Siz o'zingizning filmlaringiz ro'yxatini sinfingizdagi maydon sifatida e'lon qilishingiz va quyidagi kabi ma'lumotlarni yozishingiz mumkin:

private List getDataFromServer(int page)
{
         ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);

    Call call = apiService.getPopularMovies(API_KEY , page);


    call.enqueue(new Callback() {
        @Override
        public void onResponse(Call call, retrofit2.Response response) {
           if (response.isSuccessful())  {  
            movies = response.body().getMovies(); }
           else{
           //show error
           }

        }

        @Override
        public void onFailure(Call call, Throwable t) {
            Log.e(TAG,t.toString());
            movies = null;
        }
    });
     return movies;

}

shuningdek javobingiz muvaffaqiyatli ekanligini tekshirishni unutmang.

1
qo'shib qo'ydi

Siz o'zingizning filmlaringiz ro'yxatini sinfingizdagi maydon sifatida e'lon qilishingiz va quyidagi kabi ma'lumotlarni yozishingiz mumkin:

private List getDataFromServer(int page)
{
         ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);

    Call call = apiService.getPopularMovies(API_KEY , page);


    call.enqueue(new Callback() {
        @Override
        public void onResponse(Call call, retrofit2.Response response) {
           if (response.isSuccessful())  {  
            movies = response.body().getMovies(); }
           else{
           //show error
           }

        }

        @Override
        public void onFailure(Call call, Throwable t) {
            Log.e(TAG,t.toString());
            movies = null;
        }
    });
     return movies;

}

shuningdek javobingiz muvaffaqiyatli ekanligini tekshirishni unutmang.

1
qo'shib qo'ydi

Muammo shundaki, siz qayta qo'ng'iroq qilish usuli bo'lgan "Callback" dan qo'ng'iroq qilmoqdasiz va ma'lumotlarni yuklab olish uchun vaqt talab etiladi va kelib, sizning filmlar ro'yxatiga joylashtiriladi. Javobni oluvchining qachon qabul qilinishini hech qachon bilib bo'lmaydi, shuning uchun qaytarib olish yaxshi emas Fikringizning ichidan nima qilayotganingizni davom ettirishingiz kerak.

 @Override
    public void onResponse(Call call, retrofit2.Response response) {
       if (response.isSuccessful())  {  
        movies = response.body().getMovies();
//continue whatever you want do from here when the response is received.
         }

  }
0
qo'shib qo'ydi
Ha, men boshlaganim shu. Ammo bu bilan, men uchun cheksiz aylantirishni qayta ishlashga oid ko'rinishni amalga oshirish qiyin bo'ldi, shuning uchun ro'yxatni qaytarsam yanada osonroq qaror qildim.
qo'shib qo'ydi muallif Sriram R, manba
So'ngra qabul qilingan ro'yxatni qabul qilingan vaqtda yuboradigan onResponsega tinglovchi qo'shishingiz kerak
qo'shib qo'ydi muallif Arpan Sharma, manba

Muammo shundaki, siz qayta qo'ng'iroq qilish usuli bo'lgan "Callback" dan qo'ng'iroq qilmoqdasiz va ma'lumotlarni yuklab olish uchun vaqt talab etiladi va kelib, sizning filmlar ro'yxatiga joylashtiriladi. Javobni oluvchining qachon qabul qilinishini hech qachon bilib bo'lmaydi, shuning uchun qaytarib olish yaxshi emas Fikringizning ichidan nima qilayotganingizni davom ettirishingiz kerak.

 @Override
    public void onResponse(Call call, retrofit2.Response response) {
       if (response.isSuccessful())  {  
        movies = response.body().getMovies();
//continue whatever you want do from here when the response is received.
         }

  }
0
qo'shib qo'ydi
Ha, men boshlaganim shu. Ammo bu bilan, men uchun cheksiz aylantirishni qayta ishlashga oid ko'rinishni amalga oshirish qiyin bo'ldi, shuning uchun ro'yxatni qaytarsam yanada osonroq qaror qildim.
qo'shib qo'ydi muallif Sriram R, manba
So'ngra qabul qilingan ro'yxatni qabul qilingan vaqtda yuboradigan onResponsega tinglovchi qo'shishingiz kerak
qo'shib qo'ydi muallif Arpan Sharma, manba

Android-ning studiyadagi funktsiyalarini modifikatorni oxirigacha o'zgartirish uchun foydalanasiz deb o'ylayman, lekin siz istaganingizcha ishlamaydi va o'zgartirmaydi. Filmning o'zgartiruvchisi sizning muammomni hal qilmaydi, chunki siz boshqa ish zarrachalaridan ma'lumot olasiz va null-ga qaytasiz. ma'lumotlarni olib kelganingizda qo'ng'iroq qilish usuli

//declare movies as a class field
List movies;
...
private List getDataFromServer(int page)
{
...
call.enqueue(new Callback() {
    @Override
    public void onResponse(Call call, retrofit2.Response response) {
        dataIsReady(response.body().getMovies();
    }

    @Override
    public void onFailure(Call call, Throwable t) {
        Log.e(TAG,t.toString());
        movies = null;
    }
});
}

private void dataIsReady(List movies){
    this.movies = movies;
  //do what you want with movies
}
0
qo'shib qo'ydi

Android-ning studiyadagi funktsiyalarini modifikatorni oxirigacha o'zgartirish uchun foydalanasiz deb o'ylayman, lekin siz istaganingizcha ishlamaydi va o'zgartirmaydi. Filmning o'zgartiruvchisi sizning muammomni hal qilmaydi, chunki siz boshqa ish zarrachalaridan ma'lumot olasiz va null-ga qaytasiz. ma'lumotlarni olib kelganingizda qo'ng'iroq qilish usuli

//declare movies as a class field
List movies;
...
private List getDataFromServer(int page)
{
...
call.enqueue(new Callback() {
    @Override
    public void onResponse(Call call, retrofit2.Response response) {
        dataIsReady(response.body().getMovies();
    }

    @Override
    public void onFailure(Call call, Throwable t) {
        Log.e(TAG,t.toString());
        movies = null;
    }
});
}

private void dataIsReady(List movies){
    this.movies = movies;
  //do what you want with movies
}
0
qo'shib qo'ydi