1

我有一个活动和一个名为CourseDetails.

String getData;
DatabaseReference mRef = FirebaseDatabase.getInstance().getReference().child("courses").child("Business");
mRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        CourseDetails c = dataSnapshot.getValue(CourseDetails.class);
        getData = c.getCourseName();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

textview1.setText(getData);

使用上面的代码会在上面的最后一行抛出NullPointerException。但是如果我放入textview1.setText(getData),ValueEventListenergetData = c.getCourseName(),数据就可以正确显示了。

我发现有效的方法是使用SharedPreferences或设置来自诸如public void display(String data) { textview1.setText(data); }. 但是,即使数据在外部,还有什么其他方法可以保留检索到的数据ValueEventListener

例如,我想将添加到ArrayList.

ArrayList<String> listData;
DatabaseReference mRef = FirebaseDatabase.getInstance().getReference().child("courses").child("Business");
mRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot ds : dataSnapshot.getChildren()) {
        CourseDetails c = dataSnapshot.getValue(CourseDetails.class);
        String code = c.getCourseCode();
        String name = c.getCourseName();
        String CodeName = code + " " + name;

        listData.add(CodeName);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

// data in ArrayList should be able to display here
StringBuilder builder = new StringBuilder();
for (String s : listData) {
   builder.append(s + "\n");
}

textview1.setText(builder.toString());

如何实现这种坚持?

4

1 回答 1

3

addValueEventListener根据我的理解,当这些特定数据被修改时,Firebase 将通知所有附加到特定引用(添加数据库的数据库引用)的数据侦听器。那是什么时候 onDataChange被调用,当那些数据库引用的数据被修改时,(除了修改,该方法总是第一次被调用)。

这是异步发生的,所以在第一种情况下发生 null 因为我们不知道是否从 Firebase 检索数据,据我所知,Android 的主线程在我们检索数据之前不能被搁置或暂停,这就是为什么我们在 Android 中使用异步任务。因此,我认为对数据更改进行特定更新或任务的最佳方法是在onDataChange方法内。因此,就像您所说的那样,可以通过在onDataChange自身内部进行这些更改或通过从 onDataChange 调用其他方法来完成。

或者,如果您正在使用适配器,则通知适配器有关onDataChange. 此外,您可以查看其他选择,即FirebaseRecyclerAdapter,它将自动处理更新,无需任何额外努力。

于 2016-08-13T01:08:48.803 回答