2017-10-19 38 views
1

当我运行下面的代码有关的数据检索和存储接口的麻烦:我得到以下顺序敬酒的消息:有在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(); 

    } 

回答

0

您不能更改显示的顺序那些Toasts,因为onDataChange()方法被称为asynchronous,这意味着即使在尝试t之前也会调用尝试显示的Toast Posted text o从数据库中获取数据。这就是为什么你有这样的执行顺序。

要解决这个问题,您只需在onDataChange()方法内使用您需要从数据库获得的所有内容,否则将使用null

如果你想从数据库中使用外onDataChange()方法的数据,我建议你看从这个post我的答案。

+0

它现在工作吗? –

+0

你可以通过在这里重写代码来更具体吗?从我所能告诉的是,我在这里发布的内容以及对该帖子的回答几乎都是一样的。但是,它仍然不适合我。如果我想将数据库中的时间戳值分配给全局变量,我该如何处理它?我也不明白要传递什么作为'孩子'参数; android studio也说'孩子从不使用'。所以,请为我澄清这些问题。如果你真的可以重写代码,那将是非常棒的!非常感谢! –

+0

Arjun,您无法将数据库中的时间戳值传递给全局变量,因为这涉及到异步方法时的工作方式。你唯一需要做的就是在'onDataChange()'方法内使用'timestamp'的值。那是。这是简单的方法。 –