【问题标题】:for loop not looping right way android studiofor循环没有以正确的方式循环android studio
【发布时间】:2021-06-21 06:02:12
【问题描述】:

我正在开发一个应用程序,我正在将一张一张图片添加到 firebaseFirestore 并获取该图片的下载 url 并将该 url 保存到一个列表中,但是我的 for 循环没有正确循环它有时会运行 1 索引然后 0 索引和这种类型的错误方式最终会运行所有索引,但不是以一种方式运行。 这里最终打印的值然后它的值是某个时间 1 然后 0 这种类型它运行。请帮忙。我的代码是

     for (int i = 0; i < mViewModel.getProductImages().getValue().size(); i++){

        Uri uri1 = Uri.fromFile(new File(mViewModel.getProductImages().getValue().get(i)));
        String fileExt = MimeTypeMap.getFileExtensionFromUrl(uri1.toString());

        StorageReference mStorageReference = FirebaseStorage.getInstance().getReference("Product Images").child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                .child(productId).child("Image" + i + "." + fileExt);
        int finalI = i;
        mStorageReference.putFile(uri1).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
                if (task.isSuccessful()){
                    mStorageReference.getDownloadUrl().addOnCompleteListener(new OnCompleteListener<Uri>() {
                        @Override
                        public void onComplete(@NonNull Task<Uri> task) {
                            if (task.isSuccessful()){
                                Log.d("TAG", finalI + " " + task.getResult().toString());
                                imagesAdded.add(finalI, task.getResult().toString());
                            }
                        }
                    });
                }
            }
        });

    }`

【问题讨论】:

    标签: java android firebase loops for-loop


    【解决方案1】:

    这是因为 FirebaseStorage 会异步上传您的图片。 这是一个示例:

    for(int i = 0; i< 10; i++){
            final int counter = i;
            new Thread(){
                @Override
                public void run() {
                    System.out.println("Hello" + counter);
                }
            }.start();
     }
    

    这就像你的问题,这会乱序打印数字,但如果你使用像下面这样的锁,它会解决问题:

    Object lock = new Object();
    for(int i = 0; i< 10; i++){
        final int counter = i;
        new Thread(){
            @Override
            public void run() {
                System.out.println("Hello" + counter);
                synchronized (lock){
                    lock.notify();
                }
            }
        }.start();
        synchronized (lock){
        try {
              lock.wait();
        } catch (InterruptedException e) {
              e.printStackTrace();
        }
      }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      相关资源
      最近更新 更多