字符串在匿名内部类

时间:2017-08-25 12:55:52

标签: java android anonymous-inner-class

我正在使用google&#39; LastKnowlocation检索FusedLocationClient,并将userLocalityuserCountry存储为OnsuccesListener匿名内部类中的两个字符串。< / p>

在下面的代码中:文本集在locationProvidedTextView中是正确的(因此userLocalityuserCountry得到一些值)但是当我尝试在内部打印字符串值时他们以某种方式成为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);
          ....
   }

4 个答案:

答案 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提供商的准确性,这可能有所帮助。