代码之家  ›  专栏  ›  技术社区  ›  bhaskarkh

Android Firebase addValueEventListener稍后在循环中执行

  •  0
  • bhaskarkh  · 技术社区  · 6 年前

    这是主页.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之外的配置文件 主页中的profile after方法 第一个数据快照内的轮廓 第一个数据快照内的轮廓 第二个数据快照内的轮廓

    我在这里提出了不同的解决方案,但没有任何工作,这样做,我总是得到配置文件对象为空作为配置文件对象是获得价值以后请帮助我在这方面

    0 回复  |  直到 6 年前
        1
  •  0
  •   Rishabh Sagar    6 年前

    所以,你只是想 读取配置文件字段的值 从firebase数据库 ?

    哪个是

    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数据库是一个实时数据库,这意味着 每次更改数据库值时,它都会不断更新值。

    注: