2013-02-27 108 views
1

我試圖通過演示序列GroundOverlay來顯示Google地圖上的漸進式雷達圖像,這些圖像使用預設的雷達圖像陣列。爲了不使用戶界面繁忙,我正在爲此使用不同的線程。不幸的是,這似乎是一個奇怪的NullPointerException正在發生。我調試了代碼,並沒有找到任何可能導致此錯誤的空變量。Handler上的NullPointerException Runnable函數

我該怎麼辦? (請注意,雷達覆蓋,地圖,圖像,圖像索引和MAP_BOUNDS是全局變量,不爲空 - 請參閱1)。

編輯 - 簡化下面的代碼。仍然給出完全相同的錯誤。

public void createLooper() { 
    final Runnable runnable = new Runnable() { 
     public void run() { 
      if(run == true) { 
       mHandler.postDelayed(this,500); 
      } else { 
       return; 
      } 

      if(radaroverlay != null) { 
       radaroverlay.remove(); 
      } 
      // Problem happens in the line below. 
      try { 
       GroundOverlayOptions opts = new GroundOverlayOptions() 
              .image(images[image_index]) 
              .positionFromBounds(MAP_BOUNDS) 
              .transparency((float) 0.3); 
       radaroverlay = map.addGroundOverlay(opts); 

      } catch (Exception e) { 
       e.printStackTrace(); 
       run = false; 
      } 

      if(image_index == 19) { 
       image_index = 0; 
      } else { 
       image_index++; 
      } 
     } 
    }; 
    //mHandler.postDelayed(runnable, 500); 
    new Thread(runnable).start(); 

和相應logcat

02-27 16:58:04.815: E/AndroidRuntime(6791): FATAL EXCEPTION: main 
02-27 16:58:04.815: E/AndroidRuntime(6791): java.lang.NullPointerException 
02-27 16:58:04.815: E/AndroidRuntime(6791):  at maps.z.aa.<init>(Unknown Source) 
02-27 16:58:04.815: E/AndroidRuntime(6791):  at maps.z.bi.a(Unknown Source) 
02-27 16:58:04.815: E/AndroidRuntime(6791):  at maps.z.bi.b(Unknown Source) 
02-27 16:58:04.815: E/AndroidRuntime(6791):  at maps.z.ag.addGroundOverlay(Unknown Source) 
02-27 16:58:04.815: E/AndroidRuntime(6791):  at com.google.android.gms.maps.internal.IGoogleMapDelegate$Stub.onTransact(IGoogleMapDelegate.java:182) 
02-27 16:58:04.815: E/AndroidRuntime(6791):  at android.os.Binder.transact(Binder.java:249) 
02-27 16:58:04.815: E/AndroidRuntime(6791):  at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.addGroundOverlay(Unknown Source) 
02-27 16:58:04.815: E/AndroidRuntime(6791):  at com.google.android.gms.maps.GoogleMap.addGroundOverlay(Unknown Source) 
02-27 16:58:04.815: E/AndroidRuntime(6791):  at com.aquamet.saramap.MapActivity$2$1.run(MapActivity.java:520) 
02-27 16:58:04.815: E/AndroidRuntime(6791):  at android.os.Handler.handleCallback(Handler.java:587) 
02-27 16:58:04.815: E/AndroidRuntime(6791):  at android.os.Handler.dispatchMessage(Handler.java:92) 
02-27 16:58:04.815: E/AndroidRuntime(6791):  at android.os.Looper.loop(Looper.java:123) 
02-27 16:58:04.815: E/AndroidRuntime(6791):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
02-27 16:58:04.815: E/AndroidRuntime(6791):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-27 16:58:04.815: E/AndroidRuntime(6791):  at java.lang.reflect.Method.invoke(Method.java:521) 
02-27 16:58:04.815: E/AndroidRuntime(6791):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:876) 
02-27 16:58:04.815: E/AndroidRuntime(6791):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634) 
02-27 16:58:04.815: E/AndroidRuntime(6791):  at dalvik.system.NativeStart.main(Native Method) 

調試: Debugged variables

+0

很難說只用這個代碼,但我想,當你設定的地圖地面疊加層,你的圖像索引可以不填充或上升到19是不是20個項目? – 2013-02-27 20:58:06

+0

另外,如果radaroverlay不爲null,您是否想要刪除它?或者你想只是將它設置爲空? – 2013-02-27 21:00:10

+0

這是一個動畫,所以我需要刪除一個覆蓋,然後添加一個新的。那有意義嗎? – jhc 2013-02-27 21:03:05

回答

2

那麼原來的問題是,當我使用一個線程來更新地面疊加,而我可以從變量中讀取(如果在創建新線程之前由主線程寫入,則情況如此) ,我無法寫入變量,並期望主線程得到相同的結果。

這就解釋了爲什麼我會產生OPTS(從imagesimage_indexMAP_BOUND讀),但不能使地圖建立一個新的GroundOverlay(寫入map對象)。

我最終使用runOnUiThread而不是線程,它處理併發變量問題。

結果代碼:

public void createLooper() { 
    final Runnable runnable = new Runnable() { 
     public void run() { 
      if(run == true) { 
       mHandler.postDelayed(this,500); 
      } else { 
       return; 
      } 
      if(image_index == img_size) { 
       image_index = 0; 
      } 
      if(radaroverlay != null) { 
       radaroverlay.remove(); 
      } 
      // Problem happens in the line below. 
      try { 
       GroundOverlayOptions opts = new GroundOverlayOptions() 
              .image(images[image_index]) 
              .positionFromBounds(MAP_BOUNDS) 
              .transparency((float) 0.3); 
       radaroverlay = map.addGroundOverlay(opts); 
       image_index++; 

      } catch (Exception e) { 
       e.printStackTrace(); 
       run = false; 
      } 
     } 
    }; 
    runOnUiThread(runnable); 
} 
+0

具有完全相同的問題。謝謝! – 2013-03-03 02:11:23

+0

很高興我設法幫助除了我自己以外的人! :d – jhc 2013-03-04 21:16:33