gpt4 book ai didi

java - Android - 事务 - 任务尚未完成

转载 作者:行者123 更新时间:2023-12-04 14:55:21 26 4
gpt4 key购买 nike

我找到了几个“任务尚未完成”的例子,但还没有找到任何交易的例子。我正在使用事务,因为在我的应用程序中,如果没有互联网连接,我需要操作能够失败。我可以通过交易检测到这一点。

我有一个包含文档的集合。我正在尝试获取文件的名称。有时代码工作正常,但大多数时候我收到“任务尚未完成”错误。令人沮丧的是,我有一个“onComplete”的回调,所以当回调被...调用时交易没有完成是很奇怪的。

我在 onCompleteListener() 中收到“任务尚未完成”异常。令人沮丧的是,我什至检查以确保是否 (task.isSuccessful() && task.isComplete())。我需要使用延续吗?如果是这样,请提供一个例子 - 我还不太明白。

// 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 . (注意:挂起的服务器写入可能会合并到数据中以反射(reflect)服务器数据的最新副本)

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
}
}
})

关于java - Android - 事务 - 任务尚未完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68148398/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com