我正在使用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?
不要将任务对象转换为其他类型的对象。 您可以使用任务 API 在回调中接收异步任务的结果。 例如,如果你有一个任务,它将在成功回调中产生一个整数:
task.addOnSuccessListener(new OnSuccessListener<Integer>() {
@Override
public void onSuccess(Integer i) {
// i is the Integer result of the task.
}
});
getCount()
方法的返回类型是您可能认为的Task<Integer>
而不是Integer
。的确,在初始化Continuation
类(实际上是匿名类(时,重写方法的返回类型为Integer
,但这不是封闭getCount()
方法的返回类型。因此,此方法永远不会返回 Integer 对象。
当您尝试使用以下语句时:
Log.d(TAG, String.valueOf(getCount(counterDocRef)));
它不会打印整数,因为您向valueOf()
方法传递了一个Task<Integer>
对象而不是Integer
,这就是您得到那个奇怪的日志语句的原因。实际打印的是内存中该对象的实际地址。
若要解决此问题,应仅在内部then
方法中使用count
的值。如果您想计算集合中的所有文档,请参阅我在这篇文章中的回答。
你也可以用addOnSuccessListener
,@Doug史蒂文森在他的回答中也提到过,这是一种更简单、更优雅的方式。