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