对于每个循环,Firebase始终返回null

时间:2018-09-08 08:10:02

标签: java android firebase firebase-realtime-database

我想从Firebase中提取数据库。在for每个循环中,它显示了database的描述,但是在for每个循环之后,当我再次对其进行检查时,它显示了null,不仅显示了description,还显示了所有其他值也是如此。这是用于从Firebase提取数据的代码。它没有显示任何类型的错误。救救我。

public void getDatafromFirebase(){
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                DataSnapshot Videoreference = dataSnapshot.child("Videos");
                for (DataSnapshot videoschild : Videoreference.getChildren()){
                    DataSnapshot description = videoschild.child("Description");
                    DataSnapshot duration = videoschild.child("Duration");
                    DataSnapshot title = videoschild.child("Title");
                    DataSnapshot thumbnail = videoschild.child("Thumbnail");
                    details.setDescription(String.valueOf(description.getValue()));
                    details.setDuration(String.valueOf(duration.getValue()));
                    details.setTitle(String.valueOf(title.getValue()));
                    details.setThumbnail(String.valueOf(thumbnail.getValue()));
                    Log.e("details",details.description);
                    list.add(details);
                }
                Log.e("Size",list.get(0).description);
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Toast.makeText(getActivity(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }

1 个答案:

答案 0 :(得分:0)

如果我正确理解,您正在尝试在回调之外记录description属性(或任何其他属性)的值,并且您得到null,对吗?

发生这种情况是因为Firebase API是asynchronous,这意味着onDataChange()方法在调用后立即返回,并且它返回的Task中的回调将在一段时间后被调用。无法保证需要多长时间。因此,可能需要几百毫秒到几秒钟的时间才能获得该数据。由于该方法会立即返回,因此您尚未尝试在description方法之外使用它的onDataChange()属性的值。

基本上,您正在尝试从异步的API同步返回值。那不是一个好主意。您应该按预期异步处理API。

此问题的快速解决方案是仅在description方法内使用onDataChange()值,否则我建议您从此 {{3} } ,其中我解释了如何使用自定义回调来完成。您也可以查看此 post 以获得更好的理解。