java - 在嵌套方法中更新变量不会全局更新它

标签 java android firebase

有点难以解释。基本上,我有一个名为数据的列表,我需要添加到该列表中。这是我用来执行此操作的代码...

 public static List<WorldBrowseData> getData() {

    data = new ArrayList<>();

    ref.addListenerForSingleValueEvent(new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for(DataSnapshot children : dataSnapshot.getChildren()) {

                WorldBrowseData current = new WorldBrowseData();
                Log.v("CHILDREN",children.toString());
                current.image = children.child("image_url").getValue().toString();
                //Log.v("IMAGE",current.image);
                data.add(current);
                Log.v("DATA IN METHOD",data.toString());

            }

        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });

    Log.v("DATA IS",data.toString());
    return data;

}

当我记录“DATA IN METHOD”时,它会返回更新后的正确列表。但是当我记录(并返回)“DATA IS”时,它只是一个空列表。

此外,它在记录“DATA IN METHOD”之前记录“DATA IS”,所以基本上,它被调用,返回数据,然后更新数据,当我需要它更新然后返回时。

我做错了什么?

最佳答案

onDataChange 方法是异步执行的。在您的情况下,执行顺序如下:

 1) data = new ArrayList<>();
 2) ref.addListenerForSingleValueEvent(...
 3) Log.v("DATA IS",data.toString()); (data is not modified yet)
 4) Log.v("DATA IN METHOD",data.toString());(when the event is called)

您需要在 onDataChange 方法中执行您的代码,以获得最新版本的数据数组。

您可以修改当前方法,以便在填充后获取“数据”:

您需要创建一个监听器:

public interface OnDataLoadedListener{
  public void onFinishLoading(List<WorldBrowseData> data);
  public void onCancelled(FirebaseError firebaseError);
}

那么,您的方法将是:

public static void getData(final OnDataLoadedListener listener) {

    ref.addListenerForSingleValueEvent(new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            data = new ArrayList<>();
            for(DataSnapshot children : dataSnapshot.getChildren()) {

                WorldBrowseData current = new WorldBrowseData();
                Log.v("CHILDREN",children.toString());
                current.image = children.child("image_url").getValue().toString();
                //Log.v("IMAGE",current.image);
                data.add(current);
                Log.v("DATA IN METHOD",data.toString());

            }

            if(listener != null) listener.onFinishLoading(data);
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
          if(listener != null) listener.onCancelled(firebaseError);
        }
    });    

}

您需要调用该方法:

getData(new OnDataLoadedListener(){
   public void onFinishLoading(List<WorldBrowseData) data){
     //data is populated
   }

   public void onCancelled(FirebaseError firebaseError){
    //manage the error
   }
});

关于java - 在嵌套方法中更新变量不会全局更新它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30040053/

相关文章:

java - 切换到 Firebase 数据库 9.4.0 内存泄漏

java - Firebase 云消息传递休息 API Spring

java - 如何将 Angular2 与 Java 集成

java - 如何在 .nt 文件上保存 sparql 查询的结果

java - 如何在创建的原始窗口内的 Controller 之间进行转换

java - 从图库中选择一张图片并将其显示在另一个 Activity 中

Android Studio 在 layout.xml 中显示错误

android - 加载背景图片时 Android 4.1 中的问题

java - 使用 onCheckedChanged 的​​多个复选框事件

ios - 自定义类数据未快速显示在表格 View 中