Android Tasks.await()未按预期返回
我正在尝试将数据保存到Firebase实时数据库中。 保存的过程很好,效果也不错,但我对自己的想法很好奇:将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")
.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阻塞的主线程上运行。