Handler Runnable函数的NullPointerException

时间:2013-02-27 20:54:58

标签: android handler google-maps-android-api-2

我试图通过演示使用预设雷达图像阵列的连续GroundOverlay来在Google地图上显示渐进式雷达图像。为了不使用户界面繁忙,我正在使用不同的线程。不幸的是,似乎发生了一个奇怪的NullPointerException。我已经调试了代码,并且没有找到可能导致此问题的任何空变量。

我该怎么办?

我只会显示相关代码:(请注意,雷达覆盖,地图,图像,image_index和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

1 个答案:

答案 0 :(得分:2)

好吧原来问题是当我使用线程来更新GroundOverlays时,我可以从变量中读取(如果在创建新线程之前由主线程写入,就像这样),我无法写变量并期望主线程获得相同的结果。

这解释了为什么我可以生成opts(从imagesimage_indexMAP_BOUND读取),但无法使地图设置为新的GroundOverlay(写入{{1} } object)。

我最终使用runOnUiThread而不是线程,它负责并发变量问题。

结果代码:

map
相关问题