我可以全局定义变量然后在本地分配它并再次将它用作Java中的另一个本地方法吗?我试图在本地从FireBase数据库中获取数据。使用它我想在另一个本地方法中执行一些任务,但问题是我无法将数据传递给另一个方法。有没有办法做到这一点?
double slatitude,slongitude,currbal;
DatabaseReference mDatabase= FirebaseDatabase.getInstance().getReference();
DatabaseReference mref,mlat,mlong,mstatus;
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.travel);
// Get the Intent that started this activity and extract the string
Intent intent = getIntent();
String id = intent.getStringExtra(rfidreader.EXTRA_MESSAGE);
// Capture the layout's TextView and set the string as its text
textView = (TextView) findViewById(R.id.message);
//textView.setText(id+" "+"signed in successfully");
mref=mDatabase.child(id).child("Balance");
mlat=mDatabase.child(id).child("Start").child("Lat");
mlong=mDatabase.child(id).child("Start").child("Long");
mstatus=mDatabase.child(id).child("Status");
getData(id);
}
public void getData(String input)
{
pssngrid = input;
mDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot)
{
currbal = dataSnapshot.child(pssngrid).child("Balance").getValue(Double.class);
status = dataSnapshot.child(pssngrid).child("Status").getValue(Integer.class);
mlatiude = dataSnapshot.child(pssngrid).child("Start").child("Lat").getValue(Double.class);
mlongittude = dataSnapshot.child(pssngrid).child("Start").child("Long").getValue(Double.class);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
@Override
protected void onStart() {
super.onStart();
if(currbal>=10)
{
gps = new GPSTracker(onTravel.this);
double slatitude = gps.getLatitude();
double slongitude = gps.getLongitude();
if(status==0)
{
mlat.setValue(slatitude);
mlong.setValue(slongitude);
mstatus.setValue(1);
textView.setText("Thank you,you are eligible for travelling....");
}
else if(status==1)
{
dis=HaverSineDistance(mlatitude,mlongitude,slatitude,slongitude);
fare=dis*5;
newbal=currbal-fare;
mref.setValue(newbal);
mstatus.setValue(0);
textView.setText("Distance Traveled:"+dis+"\n"+"Current Balance:"+currbal+"\n"+"Fare:"+fare+"\n"+"Net Balance:"+newbal);
}
}
else
{
textView.setText("Sorry,you are not eligible for travelling this time.Please recharge your card..");
}
答案 0 :(得分:0)
你正在做的事情与实际上使事情成为真正的“全球”变量之间存在差异。
私有实例变量是您跨方法共享变量的方式,但是您可能会误解活动生命周期,并且Firebase不会根据它以任何保证的方式向您的应用提供数据。
换句话说,onStart
可能会先运行。然后是onCreate
和getData
,之后才发生onDataChange
事件
现在您已经看到currbal
和status
永远不会被分配的问题。
像这样获取数据更新的正确方法是从Firebase回调中进行UI更新。如果您将所需的值作为参数传递
,则不需要字段@Override
protected void onStart() {
super.onStart();
}
// separate this
private updateUI(String pssngrid, DataSnapshot dataSnapshot)
double currbal = dataSnapshot.child(pssngrid).child("Balance").getValue(Double.class);
int status = dataSnapshot.child(pssngrid).child("Status").getValue(Integer.class);
double mlatiude = dataSnapshot.child(pssngrid).child("Start").child("Lat").getValue(Double.class);
double mlongittude = dataSnapshot.child(pssngrid).child("Start").child("Long").getValue(Double.class);
if(currbal>=10) {
...
和
public void getData(final String input) {
mDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot)
{
updateUI(input, dataSnapshot);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
此外,删除所有不必要的DatabaseReference变量。你只需要你正在查询的那个
您可能希望另外将Firebase数据检索为单个Java对象,而不是单独提取字段