在Android中等待Firebase异步检索数据

在Android中等待Firebase异步检索数据

我需要存储他自己异步的FireBase getValue方法的结果。我不能使用类似“onPostExecute()”的东西,为了我的目的,我无法执行“onDataChange()”的所有操作,因为我需要在将来的其他活动中引用一些参考。

这是我的片段检索数据:

    List<Village> villages = new LinkedList<>();
    Firebase ref = new Firebase("MYFIREBASEURL").child("village");
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            spinnerArray.clear();
            for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                Village v = postSnapshot.getValue(Village.class);
                villages.add(v);
            }
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            System.out.println("The read failed: " + firebaseError.getMessage());
        }
    });

如果我尝试从“onDataChange”中读取村庄,我自然会为他的异步生活读取空值。有一种方法可以确保调用onDataChange吗?


牛魔王的故事
浏览 382回答 3
3回答

侃侃尔雅

对不起,如果这不是你想要的,因为我的英语太糟糕了。您可以定义一个侦听器接口来处理它。例:&nbsp;public&nbsp;interface&nbsp;OnGetDataListener&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onStart(); &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onSuccess(DataSnapshot&nbsp;data); &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onFailed(DatabaseError&nbsp;databaseError);}我创建了一个自定义函数来获取Database.class中的数据:&nbsp;&nbsp;public&nbsp;void&nbsp;mReadDataOnce(String&nbsp;child,&nbsp;final&nbsp;OnGetDataListener&nbsp;listener)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;listener.onStart(); &nbsp;&nbsp;&nbsp;FirebaseDatabase.getInstance().getReference().child(child).addListenerForSingleValueEvent(new&nbsp;ValueEventListener()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onDataChange(DataSnapshot&nbsp;dataSnapshot)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listener.onSuccess(dataSnapshot); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onCancelled(DatabaseError&nbsp;databaseError)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listener.onFailed(databaseError); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;});}当我想从Main.class获取数据时,我会:private&nbsp;void&nbsp;mCheckInforInServer(String&nbsp;child)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Database().mReadDataOnce(child,&nbsp;new&nbsp;OnGetDataListener()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onStart()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//DO&nbsp;SOME&nbsp;THING&nbsp;WHEN&nbsp;START&nbsp;GET&nbsp;DATA&nbsp;HERE &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onSuccess(DataSnapshot&nbsp;data)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//DO&nbsp;SOME&nbsp;THING&nbsp;WHEN&nbsp;GET&nbsp;DATA&nbsp;SUCCESS&nbsp;HERE &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onFailed(DatabaseError&nbsp;databaseError)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//DO&nbsp;SOME&nbsp;THING&nbsp;WHEN&nbsp;GET&nbsp;DATA&nbsp;FAILED&nbsp;HERE &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;});}通过这种方式,您可以重用您的方法并处理数据。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android