我的应用程序在 onLocationChanged() 一段时间后崩溃,

My App Crashes after sometime onLocationChanged(),

这是我的 LocationListener...我希望我的位置监听器只获取一次城市,并将其存储到 sharedpreference 中,然后我想将该位置用于其他 purpose.All 效果很好,但是它在一段时间后崩溃。

loclistener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {

                Geocoder gcd = new Geocoder(getBaseContext(), Locale.getDefault());
                List<Address> addresses = null;
                try {
                    addresses = gcd.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                cityName = addresses.get(0).getLocality();
                //tvLoc.append("\n" + addresses.get(0).getLocality());
                tvLoc.setText(cityName);
                editor.putString(CITYNAME,cityName);
               // Toast.makeText(Emergencylist.this,"CityName saved :"+cityName, Toast.LENGTH_LONG).show();
                editor.commit();


            }

            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {

            }

            @Override
            public void onProviderEnabled(String provider) {

            }

            @Override
            public void onProviderDisabled(String provider) {

                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivity(intent);


            }
        };

此代码危险: 如果发生异常... addresses is NULL.

 List<Address> addresses = null;
                try {
                    addresses = gcd.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                cityName = addresses.get(0).getLocality();

避免意外崩溃的解决方案:

     public void onLocationChanged(Location location) {

                    Geocoder gcd = new Geocoder(getBaseContext(), Locale.getDefault());
                    List<Address> addresses = null;
                    try {
                        addresses = gcd.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
                    if((addresses && addresses.isEmpty()) || !addresses) { return; }
                    cityName = addresses.get(0).getLocality();
                    tvLoc.setText(cityName);                                         editor.putString(CITYNAME,cityName);                   
                    editor.commit();

                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }