Назначенное значение во внутреннем классе не назначено правильно - PullRequest
0 голосов
/ 14 сентября 2018

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

public static int getInvoicesCount(String uid)
{
    final int[] count = new int[1];

    FirebaseFirestore firestore;
    firestore = FirebaseFirestore.getInstance();

    CollectionReference invoicesRef = firestore
            .collection("invoices");

    Query query = invoicesRef.whereEqualTo("creator_id",uid);

    Task<QuerySnapshot> task = query.get();


    task.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if(task.isSuccessful())
            {
                if(task.getResult().isEmpty())
                {
                    count[0] = 0;
                    Log.d("counter",String.valueOf(count[0]));
                }
                else {
                    Log.d("counter is",String.valueOf(task.getResult().size()));
                    count[0] = task.getResult().size();
                }

            }
        }
    });

    return count[0];

}

Запись значения count [0] в операторе else дает 1, но возвращаемое значение в конце функции равнопо-прежнему дает 0 вместо 1;

1 Ответ

0 голосов
/ 14 сентября 2018

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

У вас есть много опций, например Future , или присоединение обратного вызовавашему слушателю (так что слушатель вызывает обратный вызов после его завершения).

task.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if(task.isSuccessful())
        {
            if(task.getResult().isEmpty())
            {
                count[0] = 0;
                Log.d("counter",String.valueOf(count[0]));
            }
            else {
                Log.d("counter is",String.valueOf(task.getResult().size()));
                count[0] = task.getResult().size();
            }

            methodWhenListenerCompletes(count[0]);
        }
    }
});
...
public void methodWhenListenerCompletes(int count) {
  // do something
}
...