我可以全局定义变量然后在本地分配它并再次使用另一个本地方法吗?

时间:2017-12-05 07:55:30

标签: java android firebase firebase-realtime-database

我可以全局定义变量然后在本地分配它并再次将它用作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..");

        }

1 个答案:

答案 0 :(得分:0)

你正在做的事情与实际上使事情成为真正的“全球”变量之间存在差异。

私有实例变量是您跨方法共享变量的方式,但是您可能会误解活动生命周期,并且Firebase不会根据它以任何保证的方式向您的应用提供数据。

换句话说,onStart可能会先运行。然后是onCreategetData,之后才发生onDataChange事件

现在您已经看到currbalstatus永远不会被分配的问题。

像这样获取数据更新的正确方法是从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对象,而不是单独提取字段