【问题标题】:Why am I getting Nullpointer Exception when starting a Service(implements LocationListener) in android?为什么在 android 中启动服务(实现 LocationListener)时出现 Nullpointer 异常?
【发布时间】:2014-03-21 18:08:35
【问题描述】:

我是 Android 新手。我开发了一个应用程序,我需要使用 gps、互联网或使用 cellid 来跟踪用户的位置。我正在使用 2 个ActivitiesMainActivitySavelocationsActivity implements LocationListener),一个 Service(Ser) 和一个 Broadcast Receiver(k) .

当我单击MainActivity 中的Button 时,需要转到SaveLocationsActivity。几天前我曾经得到过,但现在lattitudelongitude 值已变为null,我收到以下错误,即:

null pointer exception.

由于我是新手,请逐步解释我该怎么做以及我哪里出错了。提前谢谢你。我在下面发布代码和错误日志。

保存位置活动

 public class SaveLocationsActivity extends Activity implements LocationListener{
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.savelocations);
   locationManager = (LocationManager)this.getSystemService(LOCATION_SERVICE);
    isNetworkEnabled = locationManager
    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    //Toast.makeText(this,"in activity"+isNetworkEnabled ,Toast.LENGTH_LONG).show();
          isGPSEnabled =       locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if(isNetworkEnabled==true && isGPSEnabled==false)
    {
        getLocation(LocationManager.NETWORK_PROVIDER);

    }
    else if(isGPSEnabled==true && isNetworkEnabled==false)
    {
        getLocation(LocationManager.GPS_PROVIDER);
    }
    else if(isGPSEnabled==true && isNetworkEnabled==true )
    {
        getLocation(LocationManager.GPS_PROVIDER);
    }
    private Location getLocation(String provider) {
    // TODO Auto-generated method stub
    if (locationManager.isProviderEnabled(provider)) {
        locationManager.requestLocationUpdates(provider,
                6000, 10, this);
        if (locationManager != null) {
            location = locationManager.getLastKnownLocation(provider);
            double latitude = location.getLatitude();
            double longitude = location.getLongitude();
              final String t5 = String.valueOf(latitude);
             final String t6 = String.valueOf(longitude);

            e5.setText(t5);
            e6.setText(t6);

            savelocation.put("t5",t5);
            savelocation.put("t6",t6);

            return location;
        }
    }
    return location;
}
@Override
public void onLocationChanged(Location l) {
    // TODO Auto-generated method stub
    double latitude = l.getLatitude();
    double longitude = l.getLongitude();
    final String t5 = String.valueOf(latitude);
    final String t6 = String.valueOf(longitude);
    //Toast.makeText(SaveLocationsActivity.this,""+t5,Toast.LENGTH_LONG).show();
    e5.setText(t5);
    e6.setText(t6);
}

错误日志:

  03-21 23:34:50.309: E/AndroidRuntime(15368): FATAL EXCEPTION: main
  03-21 23:34:50.309: E/AndroidRuntime(15368): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.broadcast/com.example.broadcast.SaveLocationsActivity}: java.lang.NullPointerException
 03-21 23:34:50.309: E/AndroidRuntime(15368):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2114)
 03-21 23:34:50.309: E/AndroidRuntime(15368):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2139)
 03-21 23:34:50.309: E/AndroidRuntime(15368):   at android.app.ActivityThread.access$700(ActivityThread.java:143)
 03-21 23:34:50.309: E/AndroidRuntime(15368):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1241)
 03-21 23:34:50.309: E/AndroidRuntime(15368):   at android.os.Handler.dispatchMessage(Handler.java:99)
 03-21 23:34:50.309: E/AndroidRuntime(15368):   at android.os.Looper.loop(Looper.java:137)
 03-21 23:34:50.309: E/AndroidRuntime(15368):   at android.app.ActivityThread.main(ActivityThread.java:4960)
 03-21 23:34:50.309: E/AndroidRuntime(15368):   at java.lang.reflect.Method.invokeNative(Native Method)
 03-21 23:34:50.309: E/AndroidRuntime(15368):   at java.lang.reflect.Method.invoke(Method.java:511)
  03-21 23:34:50.309: E/AndroidRuntime(15368):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
 03-21 23:34:50.309: E/AndroidRuntime(15368):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
 03-21 23:34:50.309: E/AndroidRuntime(15368):   at dalvik.system.NativeStart.main(Native Method)
 03-21 23:34:50.309: E/AndroidRuntime(15368): Caused by: java.lang.NullPointerException
 03-21 23:34:50.309: E/AndroidRuntime(15368):   at com.example.broadcast.SaveLocationsActivity.getLocation(SaveLocationsActivity.java:209)
 03-21 23:34:50.309: E/AndroidRuntime(15368):   at com.example.broadcast.SaveLocationsActivity.onCreate(SaveLocationsActivity.java:100)
 03-21 23:34:50.309: E/AndroidRuntime(15368):   at android.app.Activity.performCreate(Activity.java:5203)
 03-21 23:34:50.309: E/AndroidRuntime(15368):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
 03-21 23:34:50.309: E/AndroidRuntime(15368):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2078)
 03-21 23:34:50.309: E/AndroidRuntime(15368):   ... 11 more

【问题讨论】:

  • SaveLocationsActivity 中的第 209 行是什么
  • 这是第 209 行双纬度 = location.getLatitude();
  • 双纬度 = location.getLatitude();
  • 你应该看看 Fused Location Provider,它让 GPS 更高效

标签: android service broadcastreceiver forceclose locationlistener


【解决方案1】:

getLocation()方法中问题大概出在这里:

if (locationManager != null) {
    location = locationManager.getLastKnownLocation(provider);
    double latitude = location.getLatitude();
    double longitude = location.getLongitude();  

因为如果之前的位置未知,getLastKnownLocation 可以返回 null。因此,通过调用location.getLatitude(),您会收到NullPointerException
为避免这种情况,您可以检查 null 的返回值,例如:

if (locationManager != null) {
    location = locationManager.getLastKnownLocation(provider);
    if(location!=null)
         //...etc...

【讨论】:

  • 谢谢。它适用于 SavedLocations,但我在服务 Ser 中遇到了一些类似的错误。请问你能告诉我发生了什么吗?我试图将您告诉 SavedLocationActivity 的相同代码放入,但它没有帮助。我正在发布我的日志。请检查一下。
  • Service Ser 的问题可能是 locationManager 的初始化。可能您在 onStartCommand 方法完成初始化服务之前调用方法 getLocation。这是合法的,因为 Ser 实例之前已由其构造函数创建。尝试将locationManager的初始化放在服务的构造函数中。
猜你喜欢
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多