Android 数据未从Firebase插入ArrayList

Android 数据未从Firebase插入ArrayList,android,firebase,firebase-realtime-database,arraylist,synchronization,Android,Firebase,Firebase Realtime Database,Arraylist,Synchronization,我正在尝试将Firebase节点的数据添加到ArrayList对象中。但是数据没有填充到我的ArrayList对象中,当调用onPostExecute()时,我得到的ArrayList大小为0 如何将Firebase节点添加到ArrayList中 我的android代码 public class FirebaseSyncContacts extends AsyncTask<Void,Void,Void> { Map<String,String > contact

我正在尝试将Firebase节点的数据添加到ArrayList对象中。但是数据没有填充到我的ArrayList对象中,当调用onPostExecute()时,我得到的ArrayList大小为0

如何将Firebase节点添加到ArrayList中

我的android代码

public class FirebaseSyncContacts extends AsyncTask<Void,Void,Void> {

    Map<String,String > contacts;
    ArrayList<FirebaseUserModel> userModelObjects;
    Context context;
    public FirebaseSyncContacts(Context context,Map<String,String>contacts)
    {

        this.context=context;
        this.contacts=contacts;
        userModelObjects=new ArrayList<>();

    }

    protected void onPreExecute() {
        Log.i("app","Syncing started");
    }

    protected Void doInBackground(Void... voids) {

        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference().child("Users");
        rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(Map.Entry<String, String> singleContact: contacts.entrySet()) {
                    if (dataSnapshot.hasChild(singleContact.getKey())) {
                        Log.i("app", "Present: " + singleContact.getKey());
                        userModelObjects.add(dataSnapshot.getValue(FirebaseUserModel.class));
                    }
                    else {
                        Log.i("app", "Absent: " + singleContact.getKey());
                        userModelObjects.add(dataSnapshot.getValue(FirebaseUserModel.class));
                    }
                }
            }

            public void onCancelled(DatabaseError databaseError) {
                Log.i("app","failed to connect: "+databaseError.getMessage());
            }
        });

        return null;
    }

    protected void onPostExecute(Void aVoid) {
        Log.i("app","total contacts added: "+userModelObjects.size()); // always getting 0 
}
}
火基结构

-Users
    -ContactNo
                -fname
                -lname
                -gender
                -isInstalled
                -day
                -month
                -year
预期结果: 它应该将每个联系人号码节点添加到userModelObjects ArrayList中,并返回onPostExecute()ArrayList的总大小,即添加的联系人总数

实际结果: onPostExecute()之后返回的大小为0,即未添加任何对象

编辑 我收到了每个联系人的警告 W/ClassMapper:在com.demo.example.Firebase.FirebaseUserModel类上找不到91987654321的setter/字段


我已删除ASyncTask,但仍遇到此问题。

将类名从:

public class FirebaseUserModel {....

for循环变为:

for( DataSnapshot snapShot: dataSnapshot.getChildren()) {

 ContactNo userModel = snapShot.getValue(ContactNo.class);
 userModelObjects.add(userModel);


}
更新

-Users
    -ContactNo
                -fname
                -lname
                -gender
                -isInstalled
                -day
                -month
                -year
首先,正如我所说的,您不需要asyncTask,因此只要在您希望的任何地方使用以下代码,因为firebase为您处理后台线程:

//In your activity, do this directly:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference().child("Users");
rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {

for(DataSnapshot snapShot: dataSnapshot.getChildren()) {

ContactNo userModel = snapShot.getValue(ContactNo.class);
userModelObjects.add(userModel);
}
}

 public void onCancelled(DatabaseError databaseError) {
Log.i("app","failed to connect: "+databaseError.getMessage());
}
});
这一定是你的新课

public class ContactNo {

//make sure that these names are exactly like the keys in your database
private String fname,lname,gender;

//note if isInstalled is supposed to be a boolean, then make it a boolean and not an int 
private int isInstalled,day,month,year;

public ContactNo() { }

public ContactNo(String fname,String lname,String gender,int isInstalled,int day,int month,int year)
{

    this.fname=fname;
    this.lname=lname;
    this.gender=gender;
    this.isInstalled=isInstalled;
    this.day=day;
    this.month=month;
    this.year=year;
}

}

我认为您不需要asyncTask。这个问题是由asyncTask引起的吗?如何知道任务在没有AsyncTask的情况下完成?您不需要AsyncTask,因为firebase快照侦听器已经是一段异步代码。它正在后台监听,当您查询中的文档更新时将触发。这里要做的是在异步任务中设置一个异步任务。好的。现在我已经删除了ASyncTask,但仍然遇到同样的问题。如何解决此问题。实际上ContactNo是用户联系人号码,每次添加新联系人时,它都会发生变化。对于每个联系人号码,我都会收到此警告:W/ClassMapper:No setter/field for 91987654321在com.demo.example.Firebase.firebaseUserModel类中找到。您可以在doInBackground()中修改我的代码吗每个循环的方法?因为我在将我的每个地图键与firebase进行比较时被卡住了
public class ContactNo {

//make sure that these names are exactly like the keys in your database
private String fname,lname,gender;

//note if isInstalled is supposed to be a boolean, then make it a boolean and not an int 
private int isInstalled,day,month,year;

public ContactNo() { }

public ContactNo(String fname,String lname,String gender,int isInstalled,int day,int month,int year)
{

    this.fname=fname;
    this.lname=lname;
    this.gender=gender;
    this.isInstalled=isInstalled;
    this.day=day;
    this.month=month;
    this.year=year;
}