addValueEventListener(新的ValueEventListener()不读取数据

时间:2019-07-03 01:14:02

标签: java android android-studio listener

在我下面的代码中,setPhoto(url)函数始终接收一个空URL,但是如果我通过单击按钮调用另一个功能,并且需要该URL,它将正确接收数据。

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_perfil);


    reference = mDatabaseAPI.getUserReferenceByUid(user.getUid()).child(PHOTO_URL);
    reference.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            url = dataSnapshot.getValue(String.class);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Toast.makeText(Perfil.this, "La lectura de la foto falló", Toast.LENGTH_LONG).show();
        }
    });
    setPhoto(url);

}

2 个答案:

答案 0 :(得分:0)

您正在进行的呼叫是异步的。您需要将setPhoto(url)移至onDataChange(),紧接在您分配到url的位置之后:

@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    url = dataSnapshot.getValue(String.class);
    setPhoto(url);
}

答案 1 :(得分:0)

您是否要在除此以外的其他地方初始化url实例:

    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        url = dataSnapshot.getValue(String.class);
    }

如果不是,那么调用函数setPhoto(url)时url的值是什么?这将是您在此活动中用来初始化url的任何内容。如果使用null初始化,则它将为null。为什么不在语句之后立即在onDataChange(..)方法内移动setPhoto(url)

url = dataSnapshot.getValue(String.class);

这样,您可以确定url具有值。单击按钮时初始化url的原因很可能是因为ValueEventListener是通过调用onDataChange(...)方法来调用的。这就是为什么单击按钮时正确获得url的值的原因。希望这可以使它变得清楚些。

相关问题