Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.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
Android Tasks.await()未按预期返回_Android_Multithreading_Firebase_Firebase Realtime Database - Fatal编程技术网

Android Tasks.await()未按预期返回

Android Tasks.await()未按预期返回,android,multithreading,firebase,firebase-realtime-database,Android,Multithreading,Firebase,Firebase Realtime Database,我正在尝试将数据保存到Firebase实时数据库中。 保存的过程很好,效果也不错,但我对自己的想法很好奇:将.setValue操作强制到同步结构中。我知道,那不是最好的方法,但我想尝试一下,不管事实如何。 所以我想出了这个代码: Thread t1 = new Thread(){ public void run(){ try { Tasks.await(databaseReference.child("someChild")

我正在尝试将数据保存到Firebase实时数据库中。 保存的过程很好,效果也不错,但我对自己的想法很好奇:将
.setValue
操作强制到同步结构中。我知道,那不是最好的方法,但我想尝试一下,不管事实如何。 所以我想出了这个代码:

Thread t1 = new Thread(){
        public void run(){
            try {
                Tasks.await(databaseReference.child("someChild").setValue(someObject));
            } catch (ExecutionException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };
    t1.start();
    try {
        t1.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("finished");
}
理论上,该代码片段的目的是先在数据库中设置值,然后等待完成(通过
Tasks.wait()
),然后打印**之后*行“finished”。 我将
Tasks.await()
-命令包装在第二个线程中,因为当我没有包装时,我会得到一个异常,类似于“Tasks.await()不能在主应用程序线程中调用”

但是当我运行整个程序时,它只是停留在
t1.join()
当我删除
t1.join()时-语句,一切正常,但第二个线程(t1)在“已完成”输出出现之前尚未完成。我知道为什么会这样,但我对这个问题的解决方案并不感兴趣。

你怎么知道当你不使用
join
时,
Tasks.wait()
返回?我专门用另一个
System.out.println()测试了它好,如果“你知道为什么会这样”,请与我们分享。@Oleg问题是,将对象加载到数据库中需要一些时间。由于Firebase数据库是异步工作的,
Tasks.await()
仅在对象保存完成时返回。在这种特定的情况下,保存对象确实比简单的
System.out.println(“finished”)
-call花费更长的时间。可能是因为这里描述的原因-您有一个侦听器,它应该在被join阻塞的主线程上运行。您如何知道
Tasks.await()
在不使用
join
时返回?我专门用另一个
系统.out.println()测试了它好,如果“你知道为什么会这样”,请与我们分享。@Oleg问题是,将对象加载到数据库中需要一些时间。由于Firebase数据库是异步工作的,
Tasks.await()
仅在对象保存完成时返回。在这种特定的情况下,保存对象确实比简单的
System.out.println(“finished”)
-call需要更长的时间。可能是因为这里描述的原因-您有一个侦听器,它应该在被join阻塞的主线程上运行。