有在Java从火力地堡数据库
问题描述:
当我运行下面的代码有关的数据检索和存储接口的麻烦:我得到以下顺序敬酒的消息:有在Java从火力地堡数据库
“内部mCheckInforInServer” - >“发布文本“ - >‘接过值’
如何更改我的代码把它按以下顺序:
‘内部mCheckInforInServer’ - >‘接过价值’ - >‘发布文本’
三功能
getServerTime.setValue(ServerValue.TIMESTAMP).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
system_time = System.currentTimeMillis();
getServerTime.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
server_time_long = dataSnapshot.getValue(Long.class);
public interface OnGetDataListener {
public void onStart();
public void onSuccess(DataSnapshot data);
public void onFailed(DatabaseError databaseError);
}
public void mReadDataOnce(final OnGetDataListener listener) {
listener.onStart();
getServerTime = FirebaseDatabase.getInstance().getReference("Users/Arjun/ServerTime");
getServerTime.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
listener.onSuccess(dataSnapshot);
Toast.makeText(MainActivity.this, "Took value", Toast.LENGTH_LONG).show();
}
@Override
public void onCancelled(DatabaseError databaseError) {
listener.onFailed(databaseError);
}
});
}
private void mCheckInforInServer() {
Toast.makeText(MainActivity.this, "Inside mCheckInforInServer", Toast.LENGTH_LONG).show();
mReadDataOnce(new OnGetDataListener() {
@Override
public void onStart() {
//DO SOME THING WHEN START GET DATA HERE
}
@Override
public void onSuccess(DataSnapshot data) {
//DO SOME THING WHEN GET DATA SUCCESS HERE
server_time_display.setText(String.valueOf(data));
Toast.makeText(MainActivity.this, "Posted text", Toast.LENGTH_LONG).show();
}
@Override
public void onFailed(DatabaseError databaseError) {
//DO SOME THING WHEN GET DATA FAILED HERE
Toast.makeText(MainActivity.this, "Failed to post text", Toast.LENGTH_LONG).show();
}
});
}
当我打电话功能
我呼吁一个按钮上点击事件的函数:
get_times.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mCheckInforInServer();
}
答
您不能更改显示的顺序那些Toasts,因为onDataChange()
方法被称为asynchronous
,这意味着即使在尝试t之前也会调用尝试显示的Toast Posted text
o从数据库中获取数据。这就是为什么你有这样的执行顺序。
要解决这个问题,您只需在onDataChange()
方法内使用您需要从数据库获得的所有内容,否则将使用null
。
如果你想从数据库中使用外onDataChange()
方法的数据,我建议你看从这个post我的答案。
它现在工作吗? –
你可以通过在这里重写代码来更具体吗?从我所能告诉的是,我在这里发布的内容以及对该帖子的回答几乎都是一样的。但是,它仍然不适合我。如果我想将数据库中的时间戳值分配给全局变量,我该如何处理它?我也不明白要传递什么作为'孩子'参数; android studio也说'孩子从不使用'。所以,请为我澄清这些问题。如果你真的可以重写代码,那将是非常棒的!非常感谢! –
Arjun,您无法将数据库中的时间戳值传递给全局变量,因为这涉及到异步方法时的工作方式。你唯一需要做的就是在'onDataChange()'方法内使用'timestamp'的值。那是。这是简单的方法。 –