【发布时间】:2018-02-26 19:14:35
【问题描述】:
我在后台线程的SyncAdapter 上执行了一些代码,看起来像这样
Task<DocumentSnapshot> docTask = FirebaseFirestore.
getInstance().
collection("users_dummy").
document("ID1").
get();
当这个任务完成后,我怎样才能在后台线程上继续?
我试过.addOnCompleteListener后得到
.addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>()
{
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task)
{
// DOESN'T WORK, THIS IS THE MAIN THREAD
}
});
但正如 here 所指出的,回调是在 UI 或主线程上完成的,实际上会抛出一个
java.lang.IllegalStateException: 不能在 main 上调用 应用线程
当我执行Tasks.await(some task)之类的代码时
此处的完整示例(随意忽略):
private void performTheCodeThatDoesNotWork()
{
Task<DocumentSnapshot> docTask = FirebaseFirestore.getInstance().collection("users_dummy")
.document("ID1").get()
.addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>()
{
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task)
{
try
{
// Query the second one but block this time
Task<DocumentSnapshot> secondId = FirebaseFirestore.getInstance().collection("users_dummy")
.document("ID2").get();
/* THIS WILL THROW THE EXCEPTION ->*/ Tasks.await(secondId);
DocumentSnapshot result = secondId.getResult();
}
catch (Exception ex)
{
ex.printStackTrace();
}
Log.i("TAG", "Result is there but never reached");
}
});
Log.i("TAG", "Im here quickly, because async");
}
我尝试过Task.continueWith,但结果相同。我是否需要像在this doc stating leaking activities 中那样帮助执行者并用它调用addOnCompleteListener?
或者我错过了关于这个问题的一些微不足道的事情?在某个线程上继续执行阻塞调用有那么难吗?
【问题讨论】:
标签: android multithreading firebase task google-cloud-firestore