我在从onCompletedListener的onCompleted函数内部执行任何异步任务时遇到麻烦。
我想执行两件事
我的方法是在UploadTask的onCompleteListener中获取downloadString。然后将其作为输入传递给另一个Worker线程以更新我的用户表。新工作线程从第一个任务的onCompleteListener启动。
这是我的代码的片段。
uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
@Override
public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
if (!task.isSuccessful()) {
throw task.getException(); //TODO catch it later
}
return finalPicStorageReference.getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()) {
Uri downloadUri = task.getResult();
Log.d(TAG, "onComplete: Successfully Uploaded");
if (downloadUri != null) {
String picDownloadString = downloadUri.toString();
Constraints.Builder builder = new Constraints.Builder();
Data.Builder data = new Data.Builder();
if (profileBoolean) {
data.putBoolean("profileBoolean", true);
} else if (coverBoolean) {
data.putBoolean("coverBoolean", true);
}
data.putString("picDownloadString", picDownloadString);
/*OneTimeWorkRequest updatePicEntryAtDB = new OneTimeWorkRequest
.Builder(UpdateUserDatabaseWorker.class)
.addTag("Updating pic in database")
.setInputData(data.build())
.build();
WorkManager.getInstance(getApplicationContext()).beginUniqueWork("picUpdationInDB", ExistingWorkPolicy.APPEND,
updatePicEntryAtDB).enqueue();
*/results[0] = Result.success();
}
} else {
results[0] = Result.failure();
}
}
});
当这样被注释时,代码完美地上传了图片。但是在删除注释以允许更新用户表时,代码完全停止了工作。也就是说,图片也不会上传。
正在实施的解决方法的答案
对于初学者,我设法使用Tasks.await方法来解决。但是这里的缺点是您必须在主线程上承受很大的压力。第二种选择是拥有一个可以正常工作的WorkManager。您可以设计两个单独的工作类。第一个将图像作为输入,然后将图片上传到Firebase存储上并生成可下载的链接,另一个将这个可下载的链接作为输入,然后更新用户个人资料数据库。