处理异步任务(Firebase)返回的数据 [英] Handle data returned by an Async task (Firebase)

查看:147
本文介绍了处理异步任务(Firebase)返回的数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

  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);

查询queryRef = attendObjects.orderByChild(Constants.taAttendObjectUUID).equalTo(UUID); (DataSnapshot postSnapshot:dataSnapshot。)

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

getChildren()){
HashMap< String,Object>参加=(HashMap< String,Object>)postSnapshot.getValue();
String UUID =(String)attend.get(Constants.taAttendObjectUUID);
String userUsername =(String)attend.get(Constants.AttendObjectUserUsername);
$ b $ AttendModel attendModel = new AttendModel(userUsername,UUID);
attendArray.add(attendModel);

//这里想通知或者以某种方式返回参数数组

$覆盖$ b $ public void onCancelled(DatabaseError databaseError) {

}
});






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

解决方案

您正在寻找的是回调接口为了您的需要,您需要一个简单的界面,实现单个参数的单一方法,因为没有Java 6(Android Java版本)的开箱即用惯例,您可以轻松地自行创建它:

 接口回调{

void act(List< AttendModel> models);
}

将其作为参数传递给firebase包装方法,并用结果。
$ b $ pre $ public void getAllAttendeesFor(String UUID,final ArrayList< AttendModel> attendArray,final Callback callback){
final DatabaseReference attendObjects = getDatabaseTableWith(Constants.tableAttendObject);

查询queryRef = attendObjects.orderByChild(Constants.taAttendObjectUUID).equalTo(UUID); (DataSnapshot postSnapshot:dataSnapshot。)

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

getChildren()){
HashMap< String,Object>参加=(HashMap< String,Object>)postSnapshot.getValue();
String UUID =(String)attend.get(Constants.AttendObjectUUID);
String userUsername =(String)attend.get(Constants.AttendObjectUserUsername);
$ b $ AttendModel attendModel = new AttendModel(userUsername,UUID);
attendArray.add(attendModel);

callback.act(attendArray)
}

$ b @Override
public void onCancelled(DatabaseError databaseError){

}
});


$ / code>

然后在您的上一级方法中:

  public void getAttendants(){

ArrayList< AttendModel> attendees = new ArrayList< AttendModel>();
FirebaseConnection.getInstance()。getAllAttendeesFor(uuid,attendees,
new Callable< List< AttendModel){
void act(List< AttendModel>参加者){
// here可以更新UI
Log.d(参加者,String.valueOf(attendees.size()));
}
};





$ b

请注意,您可以更新仅在主线程上调用firebase查询的onDataChange方法时才使用UI。


I am trying to figure out how to do something with data returned from an AsyncTask.

I have an activity where I am calling an async Firebase get operation (operation existing in a different class), and I want to update an TextView existing in the Activity with the size of the ArrayList retrieved. Here is my Firebase call that get's called in Activity onCreate:

public void getAttendants() {

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

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

and here is my Firebase operation :

 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) {

        }
    });

}

What is the best approach of this in Android? Is there the possibility to implement an Adapter of sorts or a completion handler?

解决方案

What you are looking for is Callback interface, as for your needs you need simple interface that implement single method with single parameter, as there is no out of the box convention for Java 6 (Android Java version) you can easily create it by yourself:

interface Callback {

void act(List<AttendModel> models);
}

pass it as an argument to the firebase wrapping method, and call it with the result.

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) {

        }
    });

}

then in your upper level method:

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()));
          }
        };


}

Just be aware that you can update the UI only if onDataChange method of the firebase query is called on the main thread.

这篇关于处理异步任务(Firebase)返回的数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆