0

我有一個應用程序,我一直在努力。主要活動顯示使用Android版Google地圖類(v2)的地圖。有時,並不總是,當我啓動我的應用時,我會得到一個空指針。上次發生這種情況時,一天後停止發生,代碼沒有任何變化。我預感到地圖對象在查看logcat(下面發佈)後仍然不可用。零地圖組件在Android中初始化時的指針

所以我看了這個頁面:https://developers.google.com/maps/documentation/android/map(驗證地圖可用性部分),並且我已經確定地圖對象在onCreate中不爲null。

由於此問題是間歇性的,我只能猜測它與Google服務有關。我最近強制停止並清除了Google服務框架應用程序的數據,以嘗試更新到4.2.2(起訴我)。任何想法 - 有沒有人聽說過這個,還是有人知道如何解決它?

編輯:此代碼現在再次工作,完全如您在這裏看到的。我沒有改變任何東西。

所以我的問題是:什麼會導致這種行爲?我正在使用直接來自Google Maps for Android v2文檔的代碼檢查地圖對象(下面第142行的NPE)是否在onCreate(),onStart()和onResume()中爲null。

列入的onCreate(),在onStart()和的onResume()不應該允許這種...:

// Do a null check to confirm that we have not already instantiated the map. 
    if (mMap == null) { 
    mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.mainMap)) 
         .getMap(); 
    // Check if we were successful in obtaining the map. 
    if (mMap != null) { 
     // The Map is verified. It is now safe to manipulate the map. 

logcat的:

02-14 13:33:03.190: E/AndroidRuntime(5448): Caused by: java.lang.NullPointerException 
02-14 13:33:03.190: E/AndroidRuntime(5448):  at maps.ar.b.a(Unknown Source) 
02-14 13:33:03.190: E/AndroidRuntime(5448):  at maps.y.h.a(Unknown Source) 
02-14 13:33:03.190: E/AndroidRuntime(5448):  at maps.y.au.a(Unknown Source) 
02-14 13:33:03.190: E/AndroidRuntime(5448):  at maps.y.ae.moveCamera(Unknown Source) 
02-14 13:33:03.190: E/AndroidRuntime(5448):  at com.google.android.gms.maps.internal.IGoogleMapDelegate$Stub.onTransact(IGoogleMapDelegate.java:83) 
02-14 13:33:03.190: E/AndroidRuntime(5448):  at android.os.Binder.transact(Binder.java:310) 
02-14 13:33:03.190: E/AndroidRuntime(5448):  at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.moveCamera(Unknown Source) 
02-14 13:33:03.190: E/AndroidRuntime(5448):  at com.google.android.gms.maps.GoogleMap.moveCamera(Unknown Source) 
02-14 13:33:03.190: E/AndroidRuntime(5448):  at com.tyler.ioio.MainActivity.onStart(MainActivity.java:142) 
02-14 13:33:03.190: E/AndroidRuntime(5448):  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1164) 
02-14 13:33:03.190: E/AndroidRuntime(5448):  at android.app.Activity.performStart(Activity.java:5114) 
02-14 13:33:03.190: E/AndroidRuntime(5448):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2153) 
02-14 13:33:03.190: E/AndroidRuntime(5448):  ... 11 more 

MainActivity:

protected void onStart() { 
    super.onStart(); 

    // This verification should be done during onStart() because the system 
    // calls this method when the user returns to the activity, which 
    // ensures the desired location provider is enabled each time the 
    // activity resumes from the stopped state. 
    mLocMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

    final boolean gpsEnabled = mLocMan.isProviderEnabled(LocationManager.GPS_PROVIDER); 

    if (!gpsEnabled) { 
     new EnableGpsDialogFragment().show(getFragmentManager(), 
       "enableGpsDialog"); 
    } 

    // Optimized code to go to location as fast as possible 
    Location firstLoc = mLocMan.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
    updateNewFix(getBetterLocation(firstLoc, currentLoc)); 
    // THIS IS LINE 142 : FORCE CLOSES 
    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(currentLatLng, DEFAULT_ZOOM)); 
    mMap.setOnMapClickListener(this); 
+0

您是在設備上還是在仿真器上測試它?如果你有一個真正的Android設備,你可能會遇到我剛纔遇到的同樣的問題。我的手機實際上並沒有關閉應用程序,所以當我以爲我正在啓動應用程序時,它真的會調用onResume()而不是onCreate(),這會導致未聲明的對象等問題。這可能不是很接近,但它聽起來可能是你的問題。 – 2013-02-14 20:37:48

+1

你問題從這裏開始:com.tyler.ioio.MainActivity.onStart(MainActivity.java LINE#142)你可以發佈代碼來顯示你的MainActivity.java文件嗎? – petey 2013-02-14 21:26:44

+0

@BenBenard這是一款設備。我試圖卸載應用程序之間的嘗試無濟於事。 – Tyler 2013-02-15 01:09:36

回答

1

我建議你像下面一樣修改你的代碼;

@Override 
protected void onCreate(Bundle savedInstanceState) { 

mMap.setOnMapClickListener(this); 

} 

protected void onStart() { 
    super.onStart(); 

// This verification should be done during onStart() because the system 
// calls this method when the user returns to the activity, which 
// ensures the desired location provider is enabled each time the 
// activity resumes from the stopped state. 
    mLocMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

    final boolean gpsEnabled = mLocMan.isProviderEnabled(LocationManager.GPS_PROVIDER); 

    if (!gpsEnabled) { 
     new EnableGpsDialogFragment().show(getFragmentManager(), 
      "enableGpsDialog"); 
    } 


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

private void setup() { 

// Optimized code to go to location as fast as possible 
Location firstLoc = mLocMan.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
updateNewFix(getBetterLocation(firstLoc, currentLoc)); 
// THIS IS LINE 142 : FORCE CLOSES 

mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(currentLatLng, DEFAULT_ZOOM)); 

我認爲在onStart()中添加toomany方法並不合適。

+0

這是一個想法。我準確地瞄準了什麼?只是清理onStart()一點點? – Tyler 2013-02-15 20:14:22

+1

@Tyler ...請在製作Android應用程序前閱讀[此功能](http://developer.android.com/training/basics/activity-lifecycle/starting.html),然後閱讀[此程序](http: //developer.android.com/training/basics/location/locationmanager.html)在您的應用中實施Google地圖。本文檔是Android中的基本概念。 – BBonDoo 2013-02-16 00:00:59

+0

好的,抱歉,我沒有清楚地解釋我在這裏尋找什麼。我寫的代碼有效。我現在正在使用它,沒有更改onStart或onCreate。但是,在某些情況下,應用程序將強制關閉原始問題中顯示的錯誤。發生這種情況時,會發生幾個小時然後消失。到目前爲止,它發生在我身上兩次。我想我很難理解這將如何成爲代碼的一部分,而不是基礎Google服務框架的一部分。新安裝(應用程序以onCreate開頭)和onResume都會發生這種情況。 – Tyler 2013-02-16 17:46:03