Почему список массивов ratingItemList отображается как пустой после вставки нескольких элементов? - PullRequest
0 голосов
/ 07 апреля 2020

В то время как это в Снимке документа l oop это добавляет оценки в ratingItemList. Я знаю это наверняка, потому что я также печатаю размер списка в журнале, и он увеличивается. Но после того, как он выйдет из этого l oop, просто чтобы убедиться, что я проверяю, пуст он или нет, он печатает пустой список в журнале. Ребята, можете ли вы помочь мне найти ошибку?

package com.example.ratingapp;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QuerySnapshot;

import java.util.ArrayList;
import java.util.List;

public class YourRating extends AppCompatActivity {
private List<ratingItem> ratingItemList;
private FirebaseFirestore db;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_your_rating);

        ratingItemList=new ArrayList<>();



        db = FirebaseFirestore.getInstance();
        db.collection("userRatings").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                if(!queryDocumentSnapshots.isEmpty()){
                    Log.d("Check1","Ratings Exist");
                    List<DocumentSnapshot> documentSnapshots = queryDocumentSnapshots.getDocuments();
                    for(DocumentSnapshot doc : documentSnapshots) {
                        String rating = doc.getString("Rating");
                        //Log.d("Rating",rating);
                        com.google.firebase.Timestamp date = doc.getTimestamp("Date");
                        //Log.d("Date",date.toString());
                        ratingItem newRatingItem = new ratingItem(rating, date);
                        Log.d("Rating", newRatingItem.getRating());
                        Log.d("Date", newRatingItem.getTimestamp().toString());


                        ratingItemList.add(newRatingItem);
                        Log.d("Size ",String.valueOf(ratingItemList.size()));

                    }
                }
                else{
                    Toast.makeText(YourRating.this,"No ratings available!",Toast.LENGTH_LONG).show();
                }
            }
        });


        if(ratingItemList.isEmpty()){
            Log.d("Empty","Empty List");
        }
        for(ratingItem r: ratingItemList){
            Log.d("Rating1",r.getRating());
            Log.d("Date1",r.getTimestamp().toString());
        }
    }

}

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

если вы вызываете фоновый поток в первой строке и печатаете его в следующей строке, ваш метод обратного вызова не дает гарантии на выполнение до следующей строки. Он начнет выполнять поток первой строки и без ожидания ответа запустить следующую строку. Таким образом, вы получаете его пустым.

Проверьте размер списка также в методе обратного вызова onSuccess(), после for l oop:

public class YourRating extends AppCompatActivity {
private List<ratingItem> ratingItemList;
private FirebaseFirestore db;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_your_rating);

    ratingItemList = new ArrayList<>();


    db = FirebaseFirestore.getInstance();
    db.collection("userRatings").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
        @Override
        public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
            if (!queryDocumentSnapshots.isEmpty()) {
                Log.d("Check1", "Ratings Exist");
                List<DocumentSnapshot> documentSnapshots = queryDocumentSnapshots.getDocuments();
                for (DocumentSnapshot doc : documentSnapshots) {
                    String rating = doc.getString("Rating");
                    //Log.d("Rating",rating);
                    com.google.firebase.Timestamp date = doc.getTimestamp("Date");
                    //Log.d("Date",date.toString());
                    ratingItem newRatingItem = new ratingItem(rating, date);
                    Log.d("Rating", newRatingItem.getRating());
                    Log.d("Date", newRatingItem.getTimestamp().toString());


                    ratingItemList.add(newRatingItem);
                    Log.d("Size ", String.valueOf(ratingItemList.size()));

                }
                if (ratingItemList.isEmpty()) {
                    Log.d("Empty", "Empty List");
                }
                for (ratingItem r : ratingItemList) {
                    Log.d("Rating1", r.getRating());
                    Log.d("Date1", r.getTimestamp().toString());
                }
            } else {
                Toast.makeText(YourRating.this, "No ratings available!", Toast.LENGTH_LONG).show();
            }
        }
    });

}

}
0 голосов
/ 07 апреля 2020

ваш успешный слушатель работает в фоновом потоке, и это обещание будет выполнено, когда данные будут получены из базы данных. с другой стороны, фрагмент кода, в котором вы проверяете список массивов, пуст или не выполняется в потоке пользовательского интерфейса. Он не ждет получения данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...