【问题标题】:Upload to Firebase Storeage wait for upload to complete then upload to Firebase and return task上传到 Firebase 存储等待上传完成然后上传到 Firebase 并返回任务
【发布时间】:2018-12-21 08:39:57
【问题描述】:

我正在尝试将自定义对象上传到 Firebase Firestore,但 Firestore 对象应包含下载图片网址。我必须这样做的想法是先上传图像等待它完成,获取对下载 url 的引用,更新我的自定义类,然后将其上传到 Firestore。然后,我想在最后一次上传(上传到 Firestore)完成时通知我的视图。我正在考虑通过返回一个任务来做到这一点。这是我上传图片的内容:

ref.putFile(file).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                @Override
                public void onSuccess(Uri uri) {
                    //use uri to update object and then upload to firestore

                       mObject.setImageUri(uri)
                       uploadToFirestore(myObject);
                    }
                    Log.d(TAG, "onSuccess: uri= "+ uri.toString());
                }
            });
        }
    });`

我不确定如何返回 Firstore 上传的最终任务,因为它是在图像上传任务中完成的。我的目标是监听 uploadToFireStore() 何时完成,然后通知我的视图。任何建议,将不胜感激。谢谢!

编辑:我有这样的结构- View 已从用户那里获取信息,将其作为自定义对象传递给 viewmodel。然后视图模型调用 db 执行上传。 我的想法是将任务从 db 返回到 viewmodel,它将返回所述任务以查看。查看检查是否完成,然后停止加载程序。这是思考这个问题的好方法吗?

【问题讨论】:

    标签: java android firebase google-cloud-firestore firebase-storage


    【解决方案1】:

    我的工作示例。

    public class SomeClass {
        private String downloadUrl;
        private final FirebaseStorage storage = FirebaseStorage.getInstance();
        private int count = 0;
    
        public interface Callback {
            void callingBack();
            void getReady();
        }
    
        public int getCount() {
            return count;
        }
    
        private Callback callback;
    
        public void registerCallBack(Callback callback) {
            this.callback = callback;
        }
    
    
        public String getImageUri () {
            return downloadUrl;
        }
    
        public void uploadImage (String srcPath, String fileName, Context context, int size) {
            StorageReference storageRef = storage.getReference();
            StorageReference imageRef = storageRef.child(fileName);
            try {
                InputStream inputStream = new FileInputStream(new File(srcPath));
                imageRef.putStream(inputStream)
                        .continueWithTask(task -> imageRef.getDownloadUrl())
                        .addOnCompleteListener(task -> {
                            downloadUrl = task.getResult().toString();
                            callback.callingBack();
                            this.count++;
                            if (this.count == size) {
                                callback.getReady();
                                this.count = 0;
                            }
                        });
            } catch (Exception e) {
                Toast.makeText(context, "Connection error", Toast.LENGTH_LONG).show();
            }
        }    
    }
    

    活动代码

        public void someMehtod() {
    
                String fileName;
                String filePath;
                int size = YOUR_SIZE;
                String[] imgUrlList = new String[size];
                for (int i = 0; i < size; i++) {
                    fileName = "img_" + i + ".jpg"; // set target file name
                    filePath = "/storage/emulated/0/Download/images_" + i + ".jpg"; // for example (u need get your real source file paths)
                    getImageUri.registerCallBack(new GetImageUri.Callback() {
                        @Override
                        public void callingBack() {
                            imgUrlList [getImageUri.getCount()] = getImageUri.getImageUri();
                            }
                        }
        
                        @Override
                        public void getReady() {
                            // here u can use your URLs
                            for (int k = 0; k < size; k ++) {
                                Log.d(TAG, "getReady: " + imgUrlList [k]);    
                        }
                    });
                    getImageUri.uploadImage(filePath, fileName, this.getContext(), imgListCount);
                }
            }
    

    【讨论】:

      【解决方案2】:

      我想出了如何解决这个问题。使用回调。像这样创建一个界面

      public interface Callback {
        void result(Result result);
        void url(Uri downloadUrl);
      }
      

      注意:result 是一个枚举类,有两个值 FAILED 和 SUCCESS 然后在您的视图中像这样调用视图模型

      ViewModel.saveoBJECT(mObject, new Callback() {
              @Override
              public void result(Result result) {
                  switch (result){
                      case SUCCESS:
                          mProgressbar.setVisibility(View.GONE);
                          break;
                      case FAILED:
                          Log.v(TAG, "Failed");
                          Toast.makeText(getApplicationContext(), "OOPS ERROR!", Toast.LENGTH_LONG).show();
                          break;
                  }
              }
      
              @Override
              public void url(Uri downloadUrl) { }
          });
      

      在你的数据库中做这样的事情

        uploadImage(Uri.parse(imageString), prepend, new Callback() {
                  @Override
                  public void result(Result result) {}
      
                  @Override
                  public void uri(Uri downloadUrl) {
                      saveObjectInDB(downloadUrl, new Callback() {
                          @Override
                          public void result(Result result) {
                              callback.result(result);
                          }
      
                          @Override
                          public void url(Uri downloadUrl) { }
                      });
                  }
              });
      

      在上传图片功能中

       ref.putFile(file).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
              @Override
              public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                  ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                      @Override
                      public void onSuccess(Uri uri) {
                          callback.journey(uri);
                          Log.d(TAG, "onSuccess: uri= "+ uri.toString());
                      }
                  });
              }
          });
      

      在 saveObjectInDB 函数中你这样做

       db.collection(DATABASE).add(O)
              .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                  @Override
                  public void onSuccess(DocumentReference documentReference) {
                      Log.w(TAG, "Document upload complete");
                      callback.result(Result.SUCCESS);
                  }
              })
              .addOnFailureListener(new OnFailureListener() {
                  @Override
                  public void onFailure(@NonNull Exception e) {
                      Log.w(TAG, "Error adding uploading document", e);
                      callback.result(Result.FAILED);
                  }
              });
      

      【讨论】:

        猜你喜欢
        • 2021-04-28
        • 2018-12-24
        • 1970-01-01
        • 2019-11-08
        • 2022-01-10
        • 1970-01-01
        • 2021-10-06
        • 2019-05-03
        • 2020-09-19
        相关资源
        最近更新 更多