【问题标题】:Cant Add value Into Array In OnSuccess()无法在 OnSuccess() 中将值添加到数组中
【发布时间】:2021-03-22 09:49:19
【问题描述】:

我是 android 开发的新手,并尝试使用 firebase 制作应用程序。我使用个人资料照片进行注册,并将照片名称推送到数据库中。并归档到 FireStore。在底部代码mImageUrls.add(uri.toString()); 行不起作用。但它在 OnSuccess() 中烤面包,只是我无法将数据添加到数组中。我也像其他数组一样在 OnCreateView(final ArrayList<String> mImageUrls = new ArrayList<>();) 中初始化了 Array。我需要你的帮助。


  lv = (ListView) rootview.findViewById(R.id.lv_main);


        final ArrayAdapter adapter = new MyAdapter(getActivity(), name_list,date,imgs);

        myref = FirebaseDatabase.getInstance().getReference().child("MusiciansNonSensitive");
        final ArrayList<String> mImageUrls = new ArrayList<>();
        final StorageReference storageReference = FirebaseStorage.getInstance().getReference();
        myref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                for (DataSnapshot postSnapshot: snapshot.getChildren()) {
                    String name_value = postSnapshot.child("name").getValue().toString();
                    String province_value = postSnapshot.child("province").getValue().toString();

                    final String url_path = postSnapshot.child("photourl").getValue().toString();
                    StorageReference photo_url = storageReference.child("uploads/"+url_path);
                    photo_url.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {
                            mImageUrls.add(uri.toString()); // I tried to add Log.d and it adds value every for loop, but after loop it being empty array again.
                        }
                    });

                    //mImageUrls.add("A");
                    name_list.add(name_value);
                    date.add(province_value);

                }
                Log.d("LOGGOGOGOOG",mImageUrls.toString()); // Here being empty 

                //Toast.makeText(getContext(),list.toString(),Toast.LENGTH_LONG).show();
                lv.setAdapter(adapter);
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });

【问题讨论】:

  • 在 Stack Overflow 上,请不要显示文字和代码的图片。将文本复制到问题本身并设置格式,以便于阅读、复制和搜索。您可以使用底部的编辑链接编辑问题以更正此问题。
  • 感谢您的技巧。我只是在这里添加了代码。

标签: java android firebase-realtime-database firebase-storage


【解决方案1】:

addOnSuccessListener 是异步的并立即返回。稍后会调用回调,即使在循环完成并且您调用setAdapter 之后也是如此。您将不得不重写代码以仅在异步获取所有 URL 后设置适配器。您可以使用Tasks.whenAll() 等待一堆任务完成,以获取一个新任务,该任务将在您提供的任务列表完全完成后完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2014-05-06
    • 2012-02-24
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多