[英]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.