2016-09-02 3 views
0

私はプッシュ座標を取得するデータストリームを購読しています。リスナーが新しいポイントを取得するたびに地図上にマーカーを配置したい。 drawMarkerコードを正しいスレッドまたは正しいスコープに入れるために必要なことは何ですか?Android Add Map Marker Error:java.lang.IllegalStateException:メインスレッドにありません

@Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 

     enableMyLocation(); 
     subscribe(); 
    } 

    public void drawLatestPoint(LatLng p) { 
     System.out.println(p); 
     mMap.addMarker(new MarkerOptions().position(p).title("Marker in Sydney")); 
    } 

    private void subscribe(){ 
     pubNub.subscribe() 
       .channels(Arrays.asList("my_channel")) // subscribe to channel groups 
       .execute(); 

     pubNub.addListener(new SubscribeCallback() { 

      @Override 
      public void message(PubNub pubnub, PNMessageResult message) { 
       if (message.getMessage().get("lat") != null && message.getMessage().get("lng") != null) { 
        double lat = message.getMessage().get("lat").doubleValue(); 
        double lng = message.getMessage().get("lng").doubleValue(); 
        LatLng point = new LatLng(lat,lng); 
        drawLatestPoint(point); 
       } 
      } 
     }); 
    } 

答えて

1

あなたは、GUIのスレッドでコードを実行するためにrunOnUiThreadを使用することができます。

ハンドラから来ている
runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     // Your code to run in GUI thread here 
    } 
}); 
+0

ありがとう、私はあなたが単に他のスレッドを呼び出すことができなかったことを認識しませんでした。 – Strelok

0

pubsubがコンテキストオブジェクト(アプリケーションコンテキストまたはサービスコンテキスト)にアクセスできることを確認してください。その後runメソッド内で必要なコードを置く:

// Get a handler that can be used to post to the main thread 
Handler mainHandler = new Handler(context.getMainLooper()); 

Runnable myRunnable = new Runnable() { 
    @Override 
    public void run() {....} // This is your code 
}; 
mainHandler.post(myRunnable); 

Reference

+0

? ASはそれが存在しないと私に伝えます。 – Strelok

+0

[android.os.Handler](https://developer.android.com/reference/android/os/Handler.html)は、Androidフレームワークのクラスです。 –

関連する問題