Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么firebase的addValueEventListener的onDataChange方法中的ArrayList不为null,但outisde为null?_Java_Android_Firebase - Fatal编程技术网

Java 为什么firebase的addValueEventListener的onDataChange方法中的ArrayList不为null,但outisde为null?

Java 为什么firebase的addValueEventListener的onDataChange方法中的ArrayList不为null,但outisde为null?,java,android,firebase,Java,Android,Firebase,在我的项目中,我从Firebase读取数据,并将数据添加到Arraylist中 我在oncreate()中创建了我的Arraylist,并在onDataChange()中使用了它 在addValueEventListener的onDataChange方法中,ArrayList不为空,读取正确。但在其外部读取0(null)。为什么呢 我的代码: public class MainActivity extends AppCompatActivity { private ArrayList

在我的项目中,我从Firebase读取数据,并将数据添加到
Arraylist

我在oncreate()中创建了我的
Arraylist
,并在
onDataChange()中使用了它

addValueEventListener
onDataChange
方法中,ArrayList不为空,读取正确。但在其外部读取0(null)。为什么呢

我的代码:

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) 

    }

}
public类MainActivity扩展了AppCompatActivity{
私人ArrayList myListOfObjact;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//向数据库写入消息
FirebaseDatabase=FirebaseDatabase.getInstance();
DatabaseReference myRef=database.getReference();
myListOfObjacts=newarraylist();
Log.e(标记“myListOfObjacts.size:+myListOfObjacts.size());
//此处myListOfObjacts的大小为0(空)
//从数据库中读取
myRef.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
对于(DataSnapshot postsnapshot:DataSnapshot.getChildren()){
myObject data1=postsnapshot.getValue(myObject.class);
myListOfObjacts.add(data1);
}
Log.e(标记“myListOfObjacts.size:+myListOfObjacts.size());
//此处myListOfObjacts的大小读数正确
}
@凌驾
已取消的公共无效(DatabaseError错误){
//无法读取值
Log.w(标记“读取值失败”,error.toException());
}
});    
Log.e(标记“myListOfObjacts.size:+myListOfObjacts.size());
//此处myListOfObjacts的大小也是0(null)
}
}

Firebase数据库客户端在主线程之外执行所有网络和磁盘操作


Firebase数据库客户端在主线程上调用对代码的所有回调

因此,onDataChange()几乎总是在其他基于线程的主(UI)方法(如onCreate()、onStart())之后触发。。。因为onDataChange()依赖于设备的互联网速度。实际上,您看到的空值在第一次记录或调用时为空,但在您看到布局中填充的值时不是空的。

addValueEventListener()是异步的,这意味着它会立即返回调用方,当Firebase SDK运行并向服务器发出请求时,代码将继续执行。您传递给它的回调发生在请求完成后的一段时间。你不知道会持续多久,你不应该对此做出任何假设。现在,您的代码假设在添加侦听器后结果立即可用,这是无效的

如果你想要一个监听器的结果,你应该只从监听器内部进行。你不能指望结果在那之前就出来了


如果您想更多地了解Firebase API为何是异步的,.

因为当您执行
Log.e(标记“myListOfObjacts.size:”+myListOfObjacts.size())时事件侦听器尚未调用谢谢您回答我。。。但我怎样才能解决这个问题呢?我不知道你为什么要把人们引导到这里来。处理Firebase API完全没有必要这样做。它们都不会阻塞主线程,也不需要任何机制将其工作移出主线程。事实上,AsyncTask已经过时了,不应该再使用了。有更好的选择,我理解。穿线并不容易。我主要担心的是,将某人引导到此处不需要的、Android团队不再推荐的实用程序可能会导致比它解决的更大的混乱。您可能应该添加,如何对使用RecyclerView填充onDataChange返回的数据的应用程序进行异步调用,以将onDataChange外部的数据持久化。