在我下面的代码中,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);
}
答案 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的值的原因。希望这可以使它变得清楚些。