我正在编写一个
Android应用程序,我在Google地图上有标记,应该更改为我通过GCM收到的位置.
我有一个全局静态列表,我将标记与id和位置一起保存.
当我收到消息时,我可以在GCMBaseIntentService中更改列表中对象的位置,但是当我想执行以下代码时:
我有一个全局静态列表,我将标记与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(); } } } });
也许有人知道一个好的解决方案会是什么样子?
解决方法
您需要获取主UI线程的处理程序并在那里发布runnable.
Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable(){ // your UI code here }
您在Runnable中从服务中引用的任何变量都必须是最终的.既然你说你正在以全局/静态方式共享数据,你应该没问题.