【问题标题】:How can I change variable of an outside class from anonymous inner class?如何从匿名内部类更改外部类的变量?
【发布时间】:2019-02-04 03:13:34
【问题描述】:

我在数据库上有一个 ArrayList,我有一个函数 getArrayList 引用数据库并返回列表。 问题是我无法保存数组列表,因为我是从内部类获取的。

*ArrayList waiting_list 定义在外部

 private ArrayList<FirebaseUser> getWaitingList (String uid){
    database.child("books").child(""+itemNum+1)
    .addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot d:dataSnapshot.getChildren()){
                if(d.getKey().equals("waiting list"));
                        GenericTypeIndicator<ArrayList<FirebaseUser>> t = new GenericTypeIndicator<ArrayList<FirebaseUser>>() {};
                        waiting_list = d.getValue(t);// this is the problem
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    return waiting_list; //I beleive that waiting_list is still null here
}

【问题讨论】:

标签: android firebase firebase-realtime-database anonymous-inner-class


【解决方案1】:

您是对的,该列表仍然为空,因为您从不通过网络等待 Firebase 结果,您的代码只是设置了一个侦听器,然后立即返回一个空列表。

而不是来自您的方法的阻塞调用

someList = getWaitingList (String uid);
// use someData

你应该做这样的异步调用

// Do NOT make a list variable outside of this
getWaitingList (String uid, new Listener() {
    @Override onData(List someData) {
        // use someData, for example, update a listview 
    } 
});
// do NOT reference the list outside of the listener block method 

话虽如此,

定义接口

interface UserListListener {
    void onUsers(List<FirebaseUser> users);
} 

为方法添加一个参数并使其无效,因为您将从界面返回

void getWaitingList (String uid, final UserListListener listener) {
   ... 

Firebase 代码的其余部分可能没问题,但是您正在循环处理内容,所以我认为您希望添加到列表中,而不仅仅是分配一个,但无论如何,这是使用方法的其余部分回调

GenericTypeIndicator<ArrayList<FirebaseUser>> t = new GenericTypeIndicator<ArrayList<FirebaseUser>>() {};
// Move the list inside this listener 
List<FirebaseUser> waitingList = new ArrayList<>();
for (DataSnapshot d:dataSnapshot.getChildren()){
    if(d.getKey().equals("waiting list")) {
        waitingList = d.getValue(t);
    }
}
listener.onUsers(waitingList); // end of the method

然后外部方法调用负责监听类的实现,并获取数据。

您还需要实现 onCancelled ;最好先实施此操作,因为您会在此处收到 Firebase 错误通知 - 不要将其留空

【讨论】:

  • 非常感谢,确实解决了,但问题是我有一个“MyFirebase”类,它有很多函数,比如:getBook_id、getLocation、getWaiting_list 等,每个函数都需要“去” " 到 firebase 数据库并返回 String/int/ArrayList。你有什么更方便/更结构化的想法来实现它吗?
  • 我可能会建议使用更标准化的框架来实现上述模式,如 RxJava + RxFirebase,虽然学习曲线有点陡峭,但它基本上和我手动展示的一样。 Observable 是一个接口,它监听函数以“返回”并继续执行 Subscribe 操作
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多