android - 在android中使用同步()
问题描述
我有一个 android 项目,正在使用 wait() 和 notify(),因此某些代码仅在后台任务之后执行,这是一个调用 firebase 的函数:
//Code Snippet 1
public Task<String> checkIfJokeSavedFirebase() throws InterruptedException {
final String[] idToken = {""};
Map<String, Object> data = new HashMap<>();
FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
mUser.getIdToken(true)
.addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
public void onComplete(@NonNull Task<GetTokenResult> task) {
if (task.isSuccessful()) {
idToken[0] = task.getResult().getToken();
data.put("token", idToken[0]);
String someObject = "test";
synchronized (someObject) {
Log.d("longdebug","someObject pre notify");
someObject.notify();
}
//notify();
// Send token to your backend via HTTPS
// ...
} else {
// Handle error -> task.getException();
}
}
});
String someObject = "test";
synchronized (someObject){
Log.d("longdebug","someObject pre wait");
someObject.wait();
}
Log.d("runtimeexception","pre actually called");
data.put("token", idToken[0]);
//data.put("jokeid",jokeJSON.getString("id"));
return FirebaseFunctions.getInstance()
.getHttpsCallable("checkIfJokeSaved")
.call(data)
.continueWith(new Continuation<HttpsCallableResult, String>() {
@Override
public String then(@NonNull Task<HttpsCallableResult> task) throws Exception {
Log.d("runtimeexception",".then");
HashMap result = (HashMap) task.getResult().getData();
JSONObject res = new JSONObject(result);
String jokeStored = res.getString("jokeStored");
Log.d("runtimeexception","jokeStored returned");
return jokeStored;
}
});
}
还有我调用函数的代码::
//Code Snippet 2
try {
Log.d("runtimeexception","pre checkSavedCall");
activity.checkIfJokeSavedFirebase().addOnCompleteListener(new OnCompleteListener<String>() {
@Override
public void onComplete(@NonNull Task<String> task) {
Log.d("runtimeexception","pre task.getResult");
Log.d("runtimeexception","task.getResult:" + task.getResult());
jokeSaved = Boolean.parseBoolean(task.getResult());
String synchronizedChannel = "displaysaved";
synchronized (synchronizedChannel){
Log.d("runtimeexception","pre notify");
synchronizedChannel.notifyAll();
}
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
String synchronizedChannel = "displaysaved";
synchronized (synchronizedChannel){
try {
Log.d("runtimeexception","pre wait");
synchronizedChannel.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
我的代码没有进入代码片段 1 中的“.then”登录,但是当我删除时:
synchronized (synchronizedChannel){
try {
Log.d("runtimeexception","pre wait");
synchronizedChannel.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
从片段 2 开始,片段 1 进入“.then”日志并完成执行。删除 wait() 语句怎么可能导致对 firebase 函数的调用完成?
解决方案
我没有找到 Synchronized 问题的解决方案,但我只是从 AsyncTask 切换到 RxJava,并将 Firebase 调用移动到一个 Task,这样我就可以摆脱所有以前的同步语句,并且只需要两个同步语句在任务中。
推荐阅读
- python - 在 QStandardItemModel 中通过拖放移动继承的项目
- python - python中CMIP6数据的可视化
- heroku - 即使我关闭了所有可能的主机,我的机器人仍然在线
- node.js - 从云功能启动计算引擎 vm 时进行身份验证
- python - 如何从 json 文件中删除重复的条目?
- security - 限制 adb 从 AOSP 安装应用程序
- aws-lambda - 从 AWS Lambda 代理集成中的请求路径中剥离资源
- typescript - 如何在不先加载数据的情况下过滤数据?
- cuda - 是否可以在 Windows 上运行多个 CUDA 版本?
- flutter - 用于消息和通知的 Flutter 包说 RemoteMessage 类未定义说