这是我读取firebase数据的代码:

final String[] booknum = {"0"};
    databaseReference.child("All BID").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            booknum[0] =Long.toString(snapshot.getChildrenCount());
            Toast.makeText(getApplicationContext(), booknum[0],Toast.LENGTH_LONG).show();

        }
        @Override public void onCancelled(DatabaseError databaseError) {
            Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
        }
    });
    Toast.makeText(getApplicationContext(), booknum[0],Toast.LENGTH_LONG).show();

当我执行此操作时,第一个toast(在valueeventlistener中)会打印正确的答案(例如“8”)。但是外面的烤面包不管怎样都会印0。
请帮助!

最佳答案

ValueEventListener是异步的。监听器内部的代码行(包括booknum[0]的赋值)不能保证在监听器外部编写的代码行之前执行。如果某些操作依赖于booknum[0]的新值,请考虑将该操作移到ondatachange()中,以确保它使用新值。

10-05 17:43