【问题标题】:Handle data returned by an Async task (Firebase)处理异步任务返回的数据 (Firebase)
【发布时间】:2017-02-08 19:17:00
【问题描述】:

我试图弄清楚如何处理从AsyncTask 返回的数据。

我有一个活动,我正在调用异步 Firebase 获取操作(操作存在于不同的类中),并且我想用检索到的 ArrayList 的大小来更新 Activity 中存在的TextView。这是我在 Activity onCreate 中调用的 Firebase 调用:

public void getAttendants() {

   ArrayList<AttendModel> attendees = new ArrayList<AttendModel>();
    FirebaseConnection.getInstance().getAllAttendeesFor(uuid, attendees);

    Log.d("attendees", String.valueOf(attendees.size()));
}

这是我的 Firebase 操作:

 public void getAllAttendeesFor(String UUID, final ArrayList<AttendModel> attendArray) {
    final DatabaseReference attendObjects = getDatabaseTableWith(Constants.tableAttendObject);

    Query queryRef = attendObjects.orderByChild(Constants.taAttendObjectUUID).equalTo(UUID);

    queryRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                HashMap<String, Object> attend = (HashMap<String, Object>) postSnapshot.getValue();
                String UUID = (String) attend.get(Constants.taAttendObjectUUID);
                String userUsername = (String) attend.get(Constants.AttendObjectUserUsername);

                AttendModel attendModel = new AttendModel(userUsername, UUID);
                attendArray.add(attendModel);

 //here would like to notify or somehow return the attendArray
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

在 Android 中最好的方法是什么?是否有可能实现各种适配器或完成处理程序?

【问题讨论】:

  • ValueEventListener.onDataChange 一个完成处理程序。您是否考虑过从其中更新文本视图?
  • 我做了,但目前我有一个班级,我正在做我所有的 Firebase 操作,并希望有一种优雅的方式将值返回给那个班级需要(这样我消除了其他类中可能需要执行相同操作的代码冗余)
  • 有没有一种方法可以让我自己为我的函数创建一个完成处理程序,该函数将在onDataChange 中调用?
  • 您可以创建一个接口并将其传递给您执行 Firebase 操作的方法,然后在 Firebase 检索您的数据时回调您自己的onDataChange
  • 嗯,这听起来很有趣,我会检查一下,然后回来提供我希望的解决方案......谢谢

标签: android asynchronous firebase firebase-realtime-database


【解决方案1】:

您正在寻找的是回调接口,根据您的需要,您需要使用单个参数实现单个方法的简单接口,因为 Java 6(Android Java 版本)没有开箱即用的约定,您可以轻松创建它自己一个人:

interface Callback {

void act(List<AttendModel> models);
}

将其作为参数传递给 firebase 包装方法,并使用结果调用它。

public void getAllAttendeesFor(String UUID, final ArrayList<AttendModel> attendArray, final Callback callback) {
    final DatabaseReference attendObjects = getDatabaseTableWith(Constants.tableAttendObject);

    Query queryRef = attendObjects.orderByChild(Constants.taAttendObjectUUID).equalTo(UUID);

    queryRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                HashMap<String, Object> attend = (HashMap<String, Object>) postSnapshot.getValue();
                String UUID = (String) attend.get(Constants.AttendObjectUUID);
                String userUsername = (String) attend.get(Constants.AttendObjectUserUsername);

                AttendModel attendModel = new AttendModel(userUsername, UUID);
                attendArray.add(attendModel);

                callback.act(attendArray)
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

然后在你的上层方法中:

public void getAttendants() {

   ArrayList<AttendModel> attendees = new ArrayList<AttendModel>();
    FirebaseConnection.getInstance().getAllAttendeesFor(uuid, attendees, 
        new Callable<List<AttendModel) {
          void act(List<AttendModel> attendees){
            //here you can update the UI
            Log.d("attendees", String.valueOf(attendees.size()));
          }
        };


}

请注意,只有在主线程上调用 firebase 查询的 onDataChange 方法时,您才能更新 UI。

【讨论】:

  • "只有在主线程上调用firebase查询的onDataChange方法才能更新UI"是的。
  • @yosriz 如果我需要第一次查找来填充 Firebase 中的两个额外查找,该怎么办?我在这里打开了一个问题:stackoverflow.com/questions/68553544/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 2013-04-16
  • 2017-03-14
  • 2012-11-22
  • 2018-12-12
  • 2011-04-11
相关资源
最近更新 更多