在我的项目中,我从 Firebase 读取数据并将数据添加到 Arraylist<object>
中.
我创建了我的Arraylist
在 oncreate() 中并在 onDataChange()
中使用它.
在 onDataChange
方法addValueEventListener
ArrayList 不为 null,它被正确读取。但外面读的是0(空)。这是为什么?
我的代码:
public class MainActivity extends AppCompatActivity {
private ArrayList<myObject> myListOfObjact;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Write a message to the database
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference();
myListOfObjacts= new ArrayList<myObject>();
Log.e(TAG, " myListOfObjacts.size: " + myListOfObjacts.size());
// size of myListOfObjacts here is 0 (null)
// Read from the database
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot postsnapshot : dataSnapshot.getChildren()) {
myObject data1 = postsnapshot.getValue(myObject.class);
myListOfObjacts.add(data1);
}
Log.e(TAG, " myListOfObjacts.size: " + myListOfObjacts.size());
// size of myListOfObjacts here is reading correctly
}
@Override
public void onCancelled(DatabaseError error) {
// Failed to read value
Log.w(TAG, "Failed to read value.", error.toException());
}
});
Log.e(TAG, " myListOfObjacts.size: " + myListOfObjacts.size());
// size of myListOfObjacts here also is 0 (null)
}
}
最佳答案
Firebase 数据库客户端在主线程外执行所有网络和磁盘操作。
Firebase 数据库客户端在主线程上调用代码的所有回调。
因此,onDataChange() 几乎总是在其他基于主 (UI) 线程的方法(例如 onCreate()、onStart()...)之后触发,因为 onDataChange() 依赖于您设备的互联网速度。实际上,您看到的 null 值在首次记录或调用时为 null,但在您看到布局上填充的值时则不是 null。
关于java - 为什么firebase的addValueEventListener的onDataChange方法中的ArrayList不为null,但外面却为null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50125922/