无法从Firebase中的回调侦听器执行任何异步方法

问题描述 投票:0回答:1

我在从onCompletedListener的onCompleted函数内部执行任何异步任务时遇到麻烦。

我想执行两件事

  1. 将图片上传到Firebase存储并获得可下载的链接。 (完成)
  2. 更新Firestore我的用户表中的可下载链接。 (未执行)

我的方法是在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();
                }
            }
        });

当这样被注释时,代码完美地上传了图片。但是在删除注释以允许更新用户表时,代码完全停止了工作。也就是说,图片也不会上传。

android firebase google-cloud-firestore firebase-storage
1个回答
0
投票

正在实施的解决方法的答案

对于初学者,我设法使用Tasks.await方法来解决。但是这里的缺点是您必须在主线程上承受很大的压力。第二种选择是拥有一个可以正常工作的WorkManager。您可以设计两个单独的工作类。第一个将图像作为输入,然后将图片上传到Firebase存储上并生成可下载的链接,另一个将这个可下载的链接作为输入,然后更新用户个人资料数据库。

© www.soinside.com 2019 - 2024. All rights reserved.