Android:活动中MapView onDestroy上奇怪的npe

Android:活动中MapView onDestroy上奇怪的npe,android,google-maps,nullpointerexception,google-maps-android-api-2,android-mapview,Android,Google Maps,Nullpointerexception,Google Maps Android Api 2,Android Mapview,我在活动中使用mapview,但我收到一个奇怪的空指针异常,我似乎无法确定其原因 xml: onCreate中的初始化: mMapView = (MapView) findViewById(R.id.myMapView); 以及覆盖这些方法: mMapView.onCreate(savedInstanceState); @Override protected void onDestroy() { super.onDestroy(); mMapView.onDestroy();

我在活动中使用mapview,但我收到一个奇怪的空指针异常,我似乎无法确定其原因

xml:

onCreate中的初始化:

mMapView = (MapView) findViewById(R.id.myMapView);
以及覆盖这些方法:

mMapView.onCreate(savedInstanceState);

@Override
protected void onDestroy() {
    super.onDestroy();
    mMapView.onDestroy();

}


@Override
public void onLowMemory() {
    super.onLowMemory();
    mMapView.onLowMemory();

}


@Override
protected void onPause() {
    super.onPause();
    mMapView.onPause();

}


@Override
protected void onResume() {
    super.onResume();
    mMapView.onResume();


}
我不断收到mapview onDestroy方法的崩溃,其stacktrace如下所示:

java.lang.RuntimeException: Unable to destroy activity {myActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.util.LinkedList.isEmpty()' on a null object reference
                                                                           at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3831)
                                                                           at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3849)
                                                                           at android.app.ActivityThread.-wrap5(ActivityThread.java)
                                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1398)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                           at android.os.Looper.loop(Looper.java:148)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                        Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.util.LinkedList.isEmpty()' on a null object reference
                                                                           at com.google.android.gms.dynamic.zza.zzeJ(Unknown Source)
                                                                           at com.google.android.gms.dynamic.zza.onDestroy(Unknown Source)
                                                                           at com.google.android.gms.maps.MapView.onDestroy(Unknown Source)
                                                                           at myActivity.onDestroy(myActivity.java:454)
                                                                           at android.app.Activity.performDestroy(Activity.java:6422)
                                                                           at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1142)
                                                                           at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3818)
                                                                           at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3849) 
                                                                           at android.app.ActivityThread.-wrap5(ActivityThread.java) 
                                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1398) 
                                                                           at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                           at android.os.Looper.loop(Looper.java:148) 
                                                                           at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                                           at java.lang.reflect.Method.invoke(Native Method) 
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

鉴于mmapview在onCreate from xml开始时初始化,并且在onDestroy之前一直存在,那么这个空指针的原因可能是什么?

如果您确定在onDestroy()之前都是正常的,我建议这样做

@Override
protected void onDestroy() {
    if(mMapView != null) {
        mMapView.onDestroy();
    }
    super.onDestroy();
}

如果您确定在onDestroy()之前一切正常,我建议您这样做

@Override
protected void onDestroy() {
    if(mMapView != null) {
        mMapView.onDestroy();
    }
    super.onDestroy();
}

我认为您不必担心在视图中调用onDestroy()。 我可能错了,但无论如何,当活动作为XML上的视图被破坏时,应该这样做

如果要在onCreate()上初始化其他对象(适配器或演示器),最好清理它们(调用release方法/将它们设置为null或任何需要的值)

除此之外,我遵循的一条好规则是关于暂停/恢复的,什莉·克里希纳建议:清理你的资源,然后调用super

@Override
    protected void onPause() {
        // clean up your resources in respect to your onResume
        ...
        super.onPause();
    }

@Override
protected void onDestroy() {
    // clean up your resources in respect of onCreate
    ...
    super.onDestroy();
}

我认为您不必担心在视图中调用onDestroy()。 我可能错了,但无论如何,当活动作为XML上的视图被破坏时,应该这样做

如果要在onCreate()上初始化其他对象(适配器或演示器),最好清理它们(调用release方法/将它们设置为null或任何需要的值)

除此之外,我遵循的一条好规则是关于暂停/恢复的,什莉·克里希纳建议:清理你的资源,然后调用super

@Override
    protected void onPause() {
        // clean up your resources in respect to your onResume
        ...
        super.onPause();
    }

@Override
protected void onDestroy() {
    // clean up your resources in respect of onCreate
    ...
    super.onDestroy();
}

最终证明,原因是我在if语句中使用了mapview.oncreate,但该语句没有被执行。当我把它移到oncreate方法的最开始时,错误就停止了。最后,我发现原因是我在没有执行的if语句中使用了mapview.oncreate。当我把它移到oncreate方法的最开始时,错误就停止了。

如果删除
super.onDestroy()还是把这行移到下面?@ShreeKrishna一个有趣的主意-我试试看。谢谢不幸的是,崩溃仍在发生。你是否尝试过像回答中那样检查if not null?@shrekrishna是的,我尝试过-这是我第一次收到错误时尝试的第一件事情之一。如果删除
super.ondestory()还是把这行移到下面?@ShreeKrishna一个有趣的主意-我试试看。谢谢不幸的是,崩溃仍在发生。你是否尝试过像回答中那样检查if not null?@shrekrishna是的,我尝试过-这是我第一次开始出错时尝试的第一件事