繁体   English   中英

方法不会改变全局变量值

[英]Method won't change global variable value

我试图通过全局变量从内部方法中提取值,但我无法从方法中访问任何全局变量,只是我想从方法中获取值到 onCreate 方法!

从内部方法获取值到另一个方法。

public class MainActivity extends AppCompatActivity {

    FirebaseFirestore db;
    //TextView  txtv;

    double tt = 55d;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        db = FirebaseFirestore.getInstance();
        //txtv = (TextView) findViewById(R.id.txt);


            //should print value of 'lat' >> 33
            //but it print original value of tt >> 55
            // I just want value of variable 'lat' here
          System.out.println(ReadSingleContact(1));

    }

    public double ReadSingleContact(int x ) {
        String num = Integer.toString(x);
        DocumentReference contact = db.collection("MAPS").document(num);
        contact.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task ) {
                if(task.isSuccessful()){
                    DocumentSnapshot doc = task.getResult();
                    /*
                    StringBuilder data = new StringBuilder("");
                    data.append("name: ").append(doc.getString("name"));
                    data.append("\nlatitude: ").append(doc.getString("latitude"));
                    data.append("\nlongtude: ").append(doc.getString("longtude"));

                    */
                    GeoPoint geoPoint = doc.getGeoPoint("latitude");
                    final double lat = geoPoint.getLatitude();
                    final double lng = geoPoint.getLongitude();

                    //let say lat = 33
                    tt = lat;

                }
            }
        });
        return tt;
    }

}

没有语法错误,只是变量 'tt' 不会改变?

编辑- 如果您打算在多个地方使用该函数并需要使用结果,那么您需要使用回调从异步调用中获取结果(事实上,您已经在使用contact.get() )。 您需要按照以下几行重构您的代码。

为接口创建一个 java 文件。

public interface CustomCallback {
    void onComplete(double lat, double lng);
}

使用接口作为函数的参数,在获得lat & lng的值后调用onComplete

public class MainActivity extends AppCompatActivity {
    FirebaseFirestore db;
    TextView  txtv;
    double tt ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        db = FirebaseFirestore.getInstance();
        txtv = (TextView) findViewById(R.id.txt);
        //txtv.setText(ReadSingleContact(1)+"A");
        //Here you can call the function and implement the interface method that'll get called once the values for lat & lng are calculated
        ReadSingleContact(1, new CustomCallback() {
            @Override
            public void onComplete(double lat, double lng) {
                //here you can implement your required code
                //which can be changed based on what calls this method
                txtv.setText(lat+"A");
                //P.S - At this point, the value of tt would have been changed, since the `onComplete` method gets called after the value of tt is changed.
            }
        });
    }
    public void ReadSingleContact(int x, CustomCallback customCallback) {
        String num = Integer.toString(x);
        DocumentReference contact = db.collection("MAPS").document(num);
        contact.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task ) {
                if(task.isSuccessful()){
                    DocumentSnapshot doc = task.getResult();
                    /*
                    StringBuilder data = new StringBuilder("");
                    data.append("name: ").append(doc.getString("name"));
                    data.append("\nlatitude: ").append(doc.getString("latitude"));
                    data.append("\nlongtude: ").append(doc.getString("longtude"));
                    */
                    GeoPoint geoPoint = doc.getGeoPoint("latitude");
                    double lat = geoPoint.getLatitude();
                    double lng = geoPoint.getLongitude();
                    tt = 22;
                    //Call customCallback.onComplete at the end
                    if (customCallback != null) {
                        customCallback.onComplete(lat,lng);
                    }
                }
            }
        });
    }
}

contact.get()是一个异步调用,所以tt = 22; 可能只会在return tt;后发生return tt; . 如果你只是想在 textview 中设置纬度和经度值,那么在回调中这样做。

public class MainActivity extends AppCompatActivity {
    FirebaseFirestore db;
    TextView  txtv;
    double tt ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        db = FirebaseFirestore.getInstance();
        txtv = (TextView) findViewById(R.id.txt);
        //txtv.setText(ReadSingleContact(1)+"A");
    }
    public double ReadSingleContact(int x ) {
        String num = Integer.toString(x);
        DocumentReference contact = db.collection("MAPS").document(num);
        contact.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task ) {
                if(task.isSuccessful()){
                    DocumentSnapshot doc = task.getResult();
                    /*
                    StringBuilder data = new StringBuilder("");
                    data.append("name: ").append(doc.getString("name"));
                    data.append("\nlatitude: ").append(doc.getString("latitude"));
                    data.append("\nlongtude: ").append(doc.getString("longtude"));

                    */
                    GeoPoint geoPoint = doc.getGeoPoint("latitude");
                     double lat = geoPoint.getLatitude();
                    double lng = geoPoint.getLongitude();
                   //value dose not changed ??!
                    tt = 22;
                    runOnUiThread(new Runnable() {
                         void run() {
                             txtv.setText(tt+"A");
                             txtv.setText(lat+","+lng);
                         }
                    });
                }
            }
        });
        return tt;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM