Сохраните несколько изображений в хранилище Firebase, получив URL-адрес и сохранив его в Firestore, сделайте c, но отображаются только один или два URL - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь сохранить несколько изображений в хранилище, затем получить URL-адрес и сохранить их в firestore по одному.

Когда я проверяю хранилище, все выбранные изображения сохраняются успешно, но когда я проверяю только документ firestore 1 или 2 URL изображений показывает. Я думаю, что из-за l oop задача сохранения URL пропускается при следующей итерации .help?

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode==102 && resultCode==RESULT_OK && data!=null){
        ClipData clipData=data.getClipData();
        if(clipData!=null){//***********null if one image************
            for(int i=0;i<clipData.getItemCount();i++){

                imageAddress=clipData.getItemAt(i).getUri();//multi image retrieve

                String fileName = fileNameFinder.getFileName(imageAddress);

                //these are arraylist to track images upload and pending
                fileNameList.add(fileName);
                fileDoneList.add("uploading");
                uploadListAdapter.notifyDataSetChanged();

                //in storage
                final int finalI = i;
                imgLocationRef=storageRef.child("Categories").child(item_type).child(productKey).child(fileName);
                imgLocationRef.putFile(imageAddress).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
                        if(task.isSuccessful()){
                            fileDoneList.remove(finalI);
                            fileDoneList.add(finalI, "done");
                            uploadListAdapter.notifyDataSetChanged();

                            final HashMap<String,Object> imageLink=new HashMap<>();
                            imgLocationRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                                @Override
                                public void onSuccess(Uri uri) {
                                    String downloadUrl = uri.toString();
                                    //once image stored to storage then we get link then we add to firestore
                                    imageLink.put("image"+finalI,downloadUrl);//map
                                    imageDocRef.set(imageLink, SetOptions.merge()).addOnCompleteListener(new OnCompleteListener<Void>() {
                                        @Override
                                        public void onComplete(@NonNull Task<Void> task) {
                                            if(task.isSuccessful()){
                                                Log.d("image upload", "onComplete:image"+finalI+1+"uploaded");
                                            }
                                            else
                                                Log.d("image upload",task.getException().getMessage());
                                        }
                                    });
                                }
                        });
                        }
                        else{
                            Log.d("image upload error", "img upload error:"+task.getException().getMessage());
                            Toast.makeText(AddImages.this,"try again!",Toast.LENGTH_SHORT).show();
                        }
                    }
                });
            }
        }
        else {
           // imageAddress=data.getData();//for single image retrive
            Toast.makeText(AddImages.this,"Select alleast 2 images",Toast.LENGTH_SHORT).show();
        }
    }
}
...