Android Firebase addValueEventListener稍后在循环中执行

时间:2019-02-16 07:51:39

标签: java android firebase-realtime-database

这是HomePage.java代码

 ProfileDetail pd=new ProfileDetail(Email1);
                Log.d("TAG","profile in HomePage");
                Profile p=pd.getAllDetails();
                Log.d("TAG","profile after Method in HomePAge");

这是我的ProfileDetail类:

public class ProfileDetail implements Parcelable {


private  String mailId;
private Profile profile;
DatabaseReference  mDatabase= 
FirebaseDatabase.getInstance().getReference("users").child("profile");
Profile pp=null;

protected ProfileDetail(Parcel in) {
    mailId = in.readString();
}

public static final Creator<ProfileDetail> CREATOR = new Creator<ProfileDetail>() {
    @Override
    public ProfileDetail createFromParcel(Parcel in) {
        return new ProfileDetail(in);
    }

    @Override
    public ProfileDetail[] newArray(int size) {
        return new ProfileDetail[size];
    }
};

public String getMailId() {
    return mailId;
}

public void setMailId(String mailId) {
    this.mailId = mailId;
}



public ProfileDetail(String mailId)
{
 Log.d("TAG","profile inside ProfileDetail mail= "+mailId);
 this.mailId=mailId;
    readData(new FireBaseCallBack() {
        @Override
        public void onCallback(Profile p)
        {
            profile=p;
            Log.d("TAG","profile inside  louda pp="+p.toString());

            Log.d("TAG","profile inside  louda");
        }
    });
}

public Profile getAllDetails()
{

    Log.d("TAG","profile inside getALLDEtails");

    Log.d("TAG","profile inside  getALlDetails pp="+profile.toString());


return profile;
}

public void readData(final FireBaseCallBack fireBaseCallBack)
{
mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot dataSnapshot1:dataSnapshot.getChildren())
        {
            Log.d("TAG","profile inside 1st datasnapshot");
            for (DataSnapshot dataSnapshot2:dataSnapshot1.getChildren())
            {
                if (mailId.equals(dataSnapshot2.getValue(String.class)))
                {
                    pp =dataSnapshot1.getValue(Profile.class);
                    Log.d("TAG","profile inside 2nd datasnapshot");
                    // p[0] =pp;
                }


            }


        }
        fireBaseCallBack.onCallback(pp);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
});
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel parcel, int i) {
    parcel.writeString(mailId);
}


private interface FireBaseCallBack
{

    void onCallback(Profile p);
}
}

我得到这个结果

主页中的

个人资料 getALLDEtails中的配置文件 个人资料在getALLDEtails外 HomePAge中Method之后的配置文件 1st datasnapshot中的配置文件 1st datasnapshot中的配置文件 1st datasnapshot中的配置文件 第2次数据快照中的个人资料

我在这里提出了不同的解决方案,但没有任何帮助。通过执行此操作,我总是将Profile对象设置为null,因为Profile对象稍后会获得价值,请对此提供帮助

1 个答案:

答案 0 :(得分:0)

因此,您只想从Firebase数据库仅一次 读取PROFILE字段的值

在这种情况下,您必须为单个值事件设置监听器

mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {
        // Write you logic here to extract the data 
      }

      @Override
      public void onCancelled(DatabaseError databaseError) {
        // ...
      }
});

此外,如果您只是想获得有限的孩子人数,则需要添加

.limitToFirst(NUM_COUNT)

例如

mDatabase.limitToFirst(2).addListenerForSingleValueEvent(new ValueEventListener() {
          @Override
          public void onDataChange(DataSnapshot dataSnapshot) {
           // Write your logic here to extract the data
          }

          @Override
          public void onCancelled(DatabaseError databaseError) {
            // ...
          }
    });

Firebase数据库是一个实时数据库,这意味着如果您使用 addValueEventListener(),它将在每次更改数据库值时不断更新该值。

注意:请确保在不再需要该监听器时将其删除。