Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Firebase Firestore同步/无回调地检索数据_Java_Android_Firebase_Google Cloud Firestore - Fatal编程技术网

Java Firebase Firestore同步/无回调地检索数据

Java Firebase Firestore同步/无回调地检索数据,java,android,firebase,google-cloud-firestore,Java,Android,Firebase,Google Cloud Firestore,我在Android应用程序的一个单独线程中使用Cloud Firestore,所以我不想在另一个线程中使用SuccessListener和OnFailureListener上的侦听器。我可以让我的线程等待结果并捕获任何异常(如果需要) 当前用于查询的代码如下所示: FirebaseFirestore.getInstance().collection("someCollection").get().addOnSuccessListener(new OnSuccessListener<Quer

我在Android应用程序的一个单独线程中使用Cloud Firestore,所以我不想在另一个线程中使用SuccessListener和OnFailureListener上的侦听器。我可以让我的线程等待结果并捕获任何异常(如果需要)

当前用于查询的代码如下所示:

FirebaseFirestore.getInstance().collection("someCollection").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
    @Override
    public void onSuccess(QuerySnapshot documentSnapshots) {
         // do something on the UI thread with the retrieved data
         }
    });

我以前使用过Parse Server,在那里它非常简单。

您可以同步加载数据,因为DocumentReference.get返回一个任务。 所以你可以等着完成任务

如果我这样做:

    val task: Task<DocumentSnapshot> = docRef.get()
这对于在get with continuations(可能需要一段时间)之后将其他操作连接在一起非常有用:

val task:task=docRef.get.continue执行器,continuation

上面,我在一个单独的执行器上运行一个continuation,我可以用Tasks.waittask等待它全部完成

注意:您不能在主线程上调用Tasks.Wait。Tasks API专门检查此情况,并将引发异常

还有另一种同步运行的方法,使用事务。
请参见

您可以在主线程上执行类似的操作

背景线程是


如果我理解正确,您可能必须取消您在onStop或onPause中启动的请求。不是真的。我添加了一些代码来进行说明。您可以使用EventListener并用一些自定义类实现它,然后使用onEventEventListener触发您想要的操作。我特别想问的是,是否有任何方法可以避免这种情况。我错过了,谢谢。由于我的答案不再相关,我删除了它。我昨天测试了它,但它没有停止代码执行或使其同步。
    val task: Task<DocumentSnapshot> = docRef.get()
val snap: DocumentSnapshot = Tasks.await(task)
YourObject yourObject = (YourObject)new RunInBackground().
                          execute("someCollection","someDocument").get()
public class RunInBackground extends AsyncTask {

  @Override
  protected Object doInBackground(Object[] objects) {

    Task<DocumentSnapshot> documentSnapshotTask = FirebaseFirestore.getInstance().
             collection((String) objects[0]).document((String) objects[1]).get();

    YourObject obj=null;

    try {
        DocumentSnapshot documentSnapshot = Tasks.await(documentSnapshotTask);

        obj = new YourObject();
        obj.setter(documentSnapshot.get("your field"));

    } catch (ExecutionException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    return obj;
  }
}