我正在从Firebase数据库添加和检索图像。上载图像后,该图像将显示在recyclerview的另一个活动中。
当添加多个图像时,活动会一直在循环中打开,即取决于添加的图像数量。
我想在成功添加所有图像后立即打开所有活动。
我试图做一个逻辑,其中一个int a与mClipData.getItemCount()进行比较,但是它没有给出任何解决方案
请帮助我解决这个问题

P.S:给出的代码适用于多张图片

    if (data.getClipData() != null) {
        ClipData mClipData = data.getClipData();
        ArrayList<Uri> mArrayUri = new ArrayList<>();
        for (int i = 0; i < mClipData.getItemCount(); i++) {

            final ClipData.Item item = mClipData.getItemAt(i);
            final Uri mImageUri = item.getUri();
            mArrayUri.add(mImageUri);
            // Get the cursor
            Cursor cursor = getContentResolver().query(mImageUri, filePathColumn, null, null, null);
            // Move to first row
            cursor.moveToFirst();

            final StorageReference profileStorage = uploadStorage.child(mImageUri.getLastPathSegment());
            uploadTask = profileStorage.putFile(mImageUri);
            final int finalI = i;
            uploadTask.addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    showMessage(e.toString());
                }
            }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    Task<Uri> urlTask = 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();
                            }
                            downloadURL = profileStorage.getDownloadUrl().toString();
                            return profileStorage.getDownloadUrl();
                        }
                    }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                        @Override
                        public void onComplete(@NonNull Task<Uri> task) {
                            if(task.isSuccessful()){
                                Uri uri = task.getResult();
                                idRef.child(mImageUri.getLastPathSegment()).setValue(uri.toString());
                            }
                        }
                    }).addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {
                            showMessage("image upload successful ");
                            // activity opens multiple times check it //
                            a++;
                        }
                    });
                }
            });

            if(a == mClipData.getItemCount()){
                Intent intent = new Intent(getApplicationContext(), DisplayImages.class);
                startActivity(intent);
            }

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            imageEncoded  = cursor.getString(columnIndex);
            imagesEncodedList.add(imageEncoded);
            cursor.close();
        }

    }

最佳答案

上载图像时,每个图像按以下顺序进行:


您开始上传。
完成后,您将确定图像的下载URL。
完成后,将下载URL写入数据库。


这些操作都是异步的,您可以通过任务进行处理。由于您希望仅在所有下载URL都写入数据库后才显示弹出窗口,因此代码应位于最后一个完成处理程序中:

}).addOnSuccessListener(new OnSuccessListener<Uri>() {
    @Override
    public void onSuccess(Uri uri) {
        showMessage("image upload successful ");
        // activity opens multiple times check it //
        a++;

        if(a == mClipData.getItemCount()){
            Intent intent = new Intent(getApplicationContext(), DisplayImages.class);
            startActivity(intent);
        }
    }
});

10-07 13:53