java - OnSuccess 方法内的进度对话框,Firebase-Firestore?

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

我将 ArrayList 上传到 firebase-storage,然后检索下载 URL,然后将自定义数据对象存储到 firebase-firestore。我不知道何时停止进度对话框。

public void uploadNotesToSTORAGE(final ArrayList<NoteItem> nItems, final Activity activity) {
    final ProgressDialog dialog = new ProgressDialog(activity);
    dialog.setMessage("Uploading picture...");
    dialog.show();

    for (int i = 0; i < nItems.size(); i++) {
        final String id = Calendar.getInstance().getTimeInMillis() + "";
        StorageReference reference = mStorageRef.child("notes/" + id);
        String filePath = nItems.get(i).getFilePath();
        final int finalI = i;
        final int finalI1 = i;
        reference.putFile(Uri.fromFile(new File(filePath))).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                StorageReference reference = mStorageRef.child("notes/" + id);
                reference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri dUri) {
                        nItems.get(finalI).setId(id);
                        nItems.get(finalI).setDownloadLink(dUri + "");
                        db.collection("notes").document().set(nItems.get(finalI))
                                .addOnSuccessListener(new OnSuccessListener<Void>() {
                                    @Override
                                    public void onSuccess(Void aVoid) {

                                        Toast.makeText(activity, "Successfully uploaded : " + nItems.get(finalI1).getFileName(), Toast.LENGTH_SHORT).show();
                                    }
                                });
                    }
                });
            }
        }).addOnFailureListener(onFailureListener);
        dialog.dismiss();
        activity.finish();
        activity.startActivity(new Intent(activity, MainActivity.class));
    }
}

最佳答案

reference.putFile(file) 异步上传文件,因此不要在 for 循环中上传所有文件。

而不是创建一个上传文件的函数,当在 onSuccess 中成功上传文件时,从列表中删除已上传的文件对象并发送下一个文件对象进行上传。

当文件列表中没有文件时关闭对话框。

这就像一个队列。

private ProgressDialog dialog;
private ArrayList<NoteItem> nItems

public void uploadNotesToSTORAGE(final ArrayList<NoteItem> items, Activity activity) {
    nItems = items

    dialog = new ProgressDialog(activity);
    dialog.setMessage("Uploading picture...");
    dialog.show();


    if(nItems != null && !nItems.isEmpty()){
      uploadSingleNote(nItems.get(0));        //get first item
     }
}

private void uploadSingleNote(NoteItem item){
    final String id = Calendar.getInstance().getTimeInMillis() + "";
    StorageReference reference = mStorageRef.child("notes/" + id);
    String filePath = item.getFilePath();

    reference.putFile(Uri.fromFile(new File(filePath))).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            StorageReference reference = mStorageRef.child("notes/" + id);
            reference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                @Override
                public void onSuccess(Uri dUri) {
                    item.setId(id);
                    item.setDownloadLink(dUri + "");
                    db.collection("notes").document().set(nItems.get(finalI))
                    .addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void aVoid) {
                            Toast.makeText(activity, "Successfully uploaded : " + item.getFileName(), Toast.LENGTH_SHORT).show();
                            nItems.remove(0);
                            if(nItems != null && !nItems.isEmpty()){
                               uploadSingleNote(nItems.get(0));        //get first item
                             }else{
                              dialog.dismiss();
                                activity.finish();
                              activity.startActivity(new Intent(activity, MainActivity.class));
                             }
                          }
                     });
                }
            });
        }
    }).addOnFailureListener(onFailureListener);
}

关于java - OnSuccess 方法内的进度对话框,Firebase-Firestore?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58109096/

相关文章:

java - 同步适配器未运行

java - 在 Windows 上监听 "open file with my java application"事件

java - 我如何检索 child (名称和列表图像)

java - Android,Calendar.getInstance() 没有给出正确的月份

android - 拿起一个音频文件android

java - 在单个 Java 程序中同时调用 C 和 C++

java - 尝试在 Android 上运行时无法处理,索引时出错

android - 将 Android Studio 升级到 Arctic Fox 后 Gradle 同步失败

android - 在我的手机上同时保留应用程序的发布版和测试版

firebase - 找不到 com.crashlytics.sdk.android :crashlytics:17. 2.2