Метод getCount Firestore возвращает задачу. Как конвертировать в int или String? - PullRequest
0 голосов
/ 29 августа 2018

Я использую осколки Firestore для отслеживания количества документов в коллекции. Как мне преобразовать задачу, которую она возвращает, в строку?

Мой метод (аналогично документации Firebase):

public Task<Integer> getCount(final DocumentReference ref) {
    // Sum the count of each shard in the subcollection
    return ref.collection("shards").get()
            .continueWith(new Continuation<QuerySnapshot, Integer>() {
                @Override
                public Integer then(@NonNull Task<QuerySnapshot> task) throws Exception {
                    int count = 0;
                    for (DocumentSnapshot snap : task.getResult()) {
                        Shard shard = snap.toObject(Shard.class);
                        count += shard.count;
                    }
                    Log.d(TAG, Integer.toString(count));
                    return count;
                }
            });
}

правильно регистрирует счет следующим образом: D/saveMessageSent: 1

Однако, когда я вызываю метод getCount где-то еще, вот так:

Log.d(TAG, String.valueOf(getCount(counterDocRef)));

тогда вывод журнала:

D/saveMessageSent: com.google.android.gms.tasks.zzu@8673e29

Я не могу преобразовать его в строку, так как он говорит, что это

com.google.android.gms.tasks.Task<java.lang.Integer>

Как мне обойти это, так что когда я вызываю getCount, он дает мне int, который я могу использовать?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Тип возврата вашего getCount() метода - Task<Integer> и , а не и Integer, как вы, вероятно, думали. Это правда, что при инициализации класса Continuation, который на самом деле является анонимным классом, переопределяющий метод имеет тип возвращаемого значения Integer, но это не возвращаемый тип вашего вмещающего getCount() метода , Так что этот метод никогда не вернет объект Integer.

Когда вы пытаетесь использовать следующее утверждение:

Log.d(TAG, String.valueOf(getCount(counterDocRef)));

Он не будет печатать целое число, потому что вы передаете методу valueOf() объект Task<Integer>, а не Integer, и именно поэтому вы получаете этот странный лог-оператор. Что на самом деле печатает, так это фактический адрес этого объекта из памяти.

Чтобы решить эту проблему, вы должны использовать значение вашего count только внутри внутреннего метода then. Если вы хотите пересчитать все документы в коллекции, см. Мой ответ из этой записи .

Вы также можете использовать addOnSuccessListener, как упоминал @Doug Stevenson в своем ответе, что является более простым и элегантным способом.

0 голосов
/ 29 августа 2018

Вы не конвертируете Task объекты в другие типы объектов. Вы используете Task API для получения результата асинхронной задачи в обратном вызове. Например, если у вас есть задача, она выдаст целое число в обратном вызове успеха:

task.addOnSuccessListener(new OnSuccessListener<Integer>() {
    @Override
    public void onSuccess(Integer i) {
        // i is the Integer result of the task.
    }
});
...