1

GroundOverlayレーダー画像のプリセット配列を使用するシーケンシャル のプレゼンテーションを介して、Google マップにプログレッシブ レーダー画像を表示しようとしています。ユーザー インターフェイスがビジー状態にならないように、別のスレッドを使用しています。残念ながら、奇妙なことNullPointerExceptionが起こっているようです。コードをデバッグしましたが、これを引き起こしている可能性のある null 変数は見つかりませんでした。

私は何をすべきか?

関連するコードのみを示します: (raderoverlay、map、images、image_index、および MAP_BOUNDS はグローバル変数であり、null ではないことに注意してください - 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)

デバッグ: デバッグされた変数

4

1 に答える 1

2

問題は、GroundOverlaysを更新するためにスレッドを使用したときに、変数から読み取ることができる一方で(新しいスレッドが作成される前にメインスレッドによって書き込まれた場合)、変数に書き込むことができず、メインスレッドが同じ結果を得ると期待します。

imagesこれは、opts( 、、、image_indexおよびから読み取るMAP_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);
}
于 2013-02-28T18:56:01.590 に答える