Java 无法向OnSuccess()中的数组中添加值

Java 无法向OnSuccess()中的数组中添加值,java,android,firebase-realtime-database,firebase-storage,Java,Android,Firebase Realtime Database,Firebase Storage,我对安卓开发非常陌生,尝试用firebase制作应用程序。我用个人资料照片注册,并将照片名称输入数据库。然后归档到FireStore。在底部的Codemimagerls.add(uri.toString())行不工作。但它在OnSuccess()中生成toast,只是我无法将数据添加到数组中。我在OnCreateView中初始化了数组(final ArrayList mimagerurls=new ArrayList();)和其他数组一样。我需要你的帮助 lv = (ListView) r

我对安卓开发非常陌生,尝试用firebase制作应用程序。我用个人资料照片注册,并将照片名称输入数据库。然后归档到FireStore。在底部的Codemimagerls.add(uri.toString())行不工作。但它在OnSuccess()中生成toast,只是我无法将数据添加到数组中。我在OnCreateView中初始化了数组(
final ArrayList mimagerurls=new ArrayList();
)和其他数组一样。我需要你的帮助


  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) {

            }
        });

lv=(ListView)rootview.findViewById(R.id.lv_main);
final ArrayAdapter adapter=new MyAdapter(getActivity(),name_list,date,imgs);
myref=FirebaseDatabase.getInstance().getReference().child(“musiciansonsensitive”);
最终ArrayList mImageUrls=新ArrayList();
final-StorageReference-StorageReference=FirebaseStorage.getInstance().getReference();
myref.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
对于(DataSnapshot postSnapshot:snapshot.getChildren()){
String name_value=postSnapshot.child(“name”).getValue().toString();
字符串province_value=postSnapshot.child(“province”).getValue().toString();
最终字符串url_path=postSnapshot.child(“photourl”).getValue().toString();
StorageReference photo_url=StorageReference.child(“上传/”+url_路径);
photo_url.getDownloadUrl().addOnSuccessListener(新OnSuccessListener()){
@凌驾
成功时的公共无效(Uri){
mimagerurls.add(uri.toString());//我尝试添加Log.d,它为每个for循环添加值,但在循环之后,它再次成为空数组。
}
});
//添加(“A”);
名称列表。添加(名称值);
日期。添加(省值);
}
Log.d(“loggogolog”,mimagerls.toString());//此处为空
//Toast.makeText(getContext(),list.toString(),Toast.LENGTH_LONG).show();
低压设置适配器(适配器);
adapter.notifyDataSetChanged();
}
@凌驾
已取消公共void(@NonNull DatabaseError){
}
});

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

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

在堆栈溢出时,请不要显示文本和代码的图片。将文本复制到问题本身并格式化,以便阅读、复制和搜索。您可以使用底部的编辑链接编辑问题以更正此问题。谢谢您的技巧。我只是在这里添加了代码。在堆栈溢出时,请不要显示文本和代码的图片。将文本复制到问题本身并格式化,以便阅读、复制和搜索。您可以使用底部的编辑链接编辑问题以更正此问题。谢谢您的技巧。我只是在这里添加了代码。