Android-事务-任务尚未完成



我发现了一些";任务尚未完成;但是没有找到任何交易的例子。我使用交易是因为在我的应用程序中,如果没有互联网连接,我需要操作才能失败。我可以通过交易检测到这一点。

我有一个文件集。我正在设法弄清楚文件的名字。有时代码工作得很好,但大多数时候我得到的是;任务尚未完成";错误令人沮丧的是,我有一个";onComplete";所以奇怪的是,当回调被…调用时,事务没有完成。

我得到了";onCompleteListener((中的task尚未完成异常。令人沮丧的是,我甚至检查是否(task.isSuccessful((&task.isComplete(((。我需要使用continuation吗?如果是,请举一个例子——我只是还不太明白。

// Note: states is an ArrayList<String>
//       snapshot is a QuerySnapshot
public void getStatesList(){
states.clear(); 
states.add("Select A State");
db.runTransaction(new Transaction.Function<Void>() {
@Nullable
@Override
public Void apply(@NonNull Transaction transaction) {
// Collect Snapshot data
snapshot = db.collection("DATA").get();
return null;
}
}).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful() && task.isComplete()){
try{
for(QueryDocumentSnapshot document : snapshot.getResult()){
states.add(document.getId());
}
sendResponseToActivity("Success", RESULT_OK);
} catch (Exception e){
e.printStackTrace(); // Transaction is not yet complete
sendResponseToActivity("Fail", RESULT_OK);
}
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
if(e.getMessage().contains("UNAVAILABLE"))
sendResponseToActivity("NoInternet", RESULT_OK);
else
sendResponseToActivity("Fail", RESULT_OK);
}
});
} // End getStatesList()

在您的代码中,您调用db.collection("DATA").get(),但这不在事务内部操作(使用transaction.get(docRef)transaction.update(docRef, newData)等(。仅仅因为";交易";已经完成,这并不意味着这个流氓数据库调用已经完成。

如果目的是获取服务器的/DATA副本,而仅获取服务器的副本,请将Query#get(Source source)Source.SERVER一起使用。(注意:挂起的服务器写入可能会合并到数据中,以反映服务器数据的最新副本(

public void getStatesList(){
states.clear();
states.add("Select A State");
db.collection("DATA").get(Source.SERVER)
.addOnSuccessListener(querySnapshot -> {
for(QueryDocumentSnapshot document : querySnapshot){
states.add(document.getId());
}
sendResponseToActivity("Success", RESULT_OK);
})
.addOnFailureListener(ex -> {
if (ex.getMessage().contains("UNAVAILABLE")) {
sendResponseToActivity("NoInternet", RESULT_OK); // RESULT_OK?
} else {
sendResponseToActivity("Fail", RESULT_OK); // RESULT_OK?
}
});
}

然而,由于上面的版本使用和修改全局变量,我将使用来实现它

/** Returns server's list of states */
public Task<ArrayList<String>> getStatesList() {
return db.collection("DATA").get(Source.SERVER)
.onSuccessTask(querySnapshot -> {
ArrayList<String> states = new ArrayList<>();
// NOTE: states.add("Select A State"); was removed here

for (QueryDocumentSnapshot document : querySnapshot) {
states.add(document.getId());
}
return Tasks.forResult(states);
});
}

然后像这样使用:

getStatesList().addOnCompleteListener(task -> {
if (task.isSuccessful()) {
ArrayList<String> states = task.getResult();
// do something with states, like update UI
// don't forget that "Select A State" isn't in the array
} else {
Exception ex = task.getException();
if (ex.getMessage().contains("UNAVAILABLE")) {
// offline, do something
} else {
// unexpected error, do something
}
}
})

最新更新