我正在使用google' LastKnowlocation
检索FusedLocationClient
,并将userLocality
和userCountry
存储为OnsuccesListener
匿名内部类中的两个字符串。< / p>
在下面的代码中:文本集在locationProvidedTextView
中是正确的(因此userLocality
和userCountry
得到一些值)但是当我尝试在内部打印字符串值时他们以某种方式成为null
。
这可能是一个愚蠢的问题,但我做错了什么?我需要在另一个OnclickListener
方法中使用这些值。
代码段:
// GlOBAL VARIABLES
....
private String userCountry;
private String userLocality;
@Override
protected void onCreate(Bundle savedInstanceState) {
....
mFusedLocationClient.getLastLocation()
.addOnSuccessListener(this, new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
// Got last known location. In some rare situations this can be null.
if (location != null) {
Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault());
try {
List<Address> addresses = geoCoder
.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
if (addresses.size() > 0) {
if (addresses.size() > 0) {
userLocality = addresses.get(0).getLocality();
userCountry = addresses.get(0).getCountryName();
locationProvidedTextView.setText("Your address: " + userLocality + ", " + userCountry);
}
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
});
// HERE BOTH STRINGS BECOME NULL
System.out.println("ADDRESS1 ======= " + userLocality);
System.out.println("ADDRESS2 ======= " + userCountry);
....
}
答案 0 :(得分:1)
问题是您没有构建任何检索值的机制。换句话说,您的onCreate
现在看起来像这样:
onCreate{
// set listener
// print stuff out
}
在调用侦听器之后,值将被设置,但此时您已经完成了onCreate
方法。
答案 1 :(得分:1)
这很正常。
我不知道你的代码,但似乎addOnSuccessListener是一个异步机制。
因此,您希望在异步部分之外显示尚未设置的值。
换句话说,您尝试显示尚未设置的值。
要测试这个你可以放: 在addOnSuccessListener内部a:
System.out.println("User locality found");
您将看到该消息可能在
之后出现System.out.println("ADDRESS1 ======= " + userLocality);
答案 2 :(得分:1)
获取位置需要一些时间。根据您的代码,您将立即打印mFusedLocationClient.getLastLocation().addOnSuccessListener
您的听众不会立即被召唤。所以你不会在这些字符串中获得任何价值。
更好的实现方法是,在另一个类中执行与位置相关的所有操作,而不是在onCreate中。然后使用interface
获取结果。
答案 3 :(得分:0)
String className;
if (Parameter == 0) {
className = "class.A." + Parameter + "Activity";
} else if (Parameter == 1) {
className = "class.B." + Parameter + "Activity";
}
Class activityClass = Class.forName(className);
Intent intent = new Intent(ExampleActivity.this, activityClass);
intent.setAction(Intent.ACTION_VIEW);
startActivity(intent);
我猜这种方法每次基于GPS准确得到坐标时都会将数据设置为userLocality和userCountry但是当GPS禁用或网络不强时,它会给出错读,这可能导致获得null字符串变量应该尝试更改提供商以及网络或gps提供商的准确性,这可能有所帮助。