6

私はアンドロイドアプリを書いています.Googleマップにマーカーがあり、GCMが受け取る位置に変更する必要があります. IDと位置とともにマーカーを保存するグローバル静的リストがあります。メッセージを受信したときに GCMBaseIntentService のリスト内のオブジェクトの位置を変更できますが、次のコードを実行したい場合:

    mMarker.setPosition(new LatLng(member.getLatitude(),member.getLongitude()));

次の例外が発生します。

    01-13 18:52:38.118: E/AndroidRuntime(7605): FATAL EXCEPTION: IntentService[GCMIntentService-1041237551356-1]
    01-13 18:52:38.118: E/AndroidRuntime(7605): java.lang.IllegalStateException: Not on the main thread
    01-13 18:52:38.118: E/AndroidRuntime(7605):     at maps.am.r.b(Unknown Source)
    01-13 18:52:38.118: E/AndroidRuntime(7605):     at maps.ar.d.b(Unknown Source)
    01-13 18:52:38.118: E/AndroidRuntime(7605):     at maps.y.ae.addMarker(Unknown Source)
    01-13 18:52:38.118: E/AndroidRuntime(7605):     at com.google.android.gms.maps.internal.IGoogleMapDelegate$Stub.onTransact(IGoogleMapDelegate.java:167)
    01-13 18:52:38.118: E/AndroidRuntime(7605):     at android.os.Binder.transact(Binder.java:279)
    01-13 18:52:38.118: E/AndroidRuntime(7605):     at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.addMarker(Unknown Source)
    01-13 18:52:38.118: E/AndroidRuntime(7605):     at com.google.android.gms.maps.GoogleMap.addMarker(Unknown Source)
    01-13 18:52:38.118: E/AndroidRuntime(7605):     at com.example.MapViewActivity.showMember(MapViewActivity.java:529)
    01-13 18:52:38.118: E/AndroidRuntime(7605):     at com.example.MapViewActivity.updateMember(MapViewActivity.java:417)
    01-13 18:52:38.118: E/AndroidRuntime(7605):     at com.example.MapViewActivity.updateMembers(MapViewActivity.java:410)
    01-13 18:52:38.118: E/AndroidRuntime(7605):     at com.example.pushnotifications.GCMIntentService.onMessage(GCMIntentService.java:75)
    01-13 18:52:38.118: E/AndroidRuntime(7605):     at com.google.android.gcm.GCMBaseIntentService.onHandleIntent(GCMBaseIntentService.java:223)
    01-13 18:52:38.118: E/AndroidRuntime(7605):     at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:59)
    01-13 18:52:38.118: E/AndroidRuntime(7605):     at android.os.Handler.dispatchMessage(Handler.java:99)
    01-13 18:52:38.118: E/AndroidRuntime(7605):     at android.os.Looper.loop(Looper.java:130)
    01-13 18:52:38.118: E/AndroidRuntime(7605):     at android.os.HandlerThread.run(HandlerThread.java:60)

すべてのマーカーを(まったく同じコードで)更新するボタンをマップに追加してみましたが、それは正常に機能します。どういうわけか問題は、GCMが別のスレッドなどで実行されていることであり、別のスレッドからマーカーを変更できないようです...

私は醜い解決策を試しました: すべてのマーカーを毎秒更新することです。ただし、MapViewActivity からスレッドを作成すると、同じ例外が発生します。

private Thread MarkerUpdater = new Thread(
    new Runnable() {
        public void run() {
            while(true) {
                updateMembers();
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    });

たぶん、誰かが素晴らしい解決策がどのように見えるか考えているでしょうか?

4

4 に答える 4

11

メインUIスレッドのハンドラーを取得し、そこにランナブルを投稿する必要があります。

Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable(){ 
   // your UI code here 
}

のサービスから参照する変数はすべて、Runnable最終的なものである必要があります。データをグローバル/静的として共有していると言ったので、大丈夫です。

于 2013-01-13T22:27:17.440 に答える
2

これを試して、

Handler handler = new Handler(Looper.getMainLooper());
    handler.post(new Runnable() {
         @Override
         public void run() {
              //your code
         }
});
于 2016-04-28T12:44:28.090 に答える
0

Use my code:

    private class UpdateThread extends AsyncTask<Void, Void, Void>
    {
        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
            //...
            mMarker.setPosition(new LatLng(member.getLatitude(),member.getLongitude()));
        }
        @Override
        protected Void doInBackground(Void... params) {

            while(true)
            {
                try {
                    //...
                    publishProgress();

                    Thread.sleep(3000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    UpdateThread updateThread = new UpdateThread();
    updateThread.execute();
于 2014-11-24T15:51:00.397 に答える