java.lang.IllegalStateException:不在主线程上

The*_*ime 2 java android google-maps

当服务器端的制造商表中没有可用数据时,我试图从 FragmentActivity 映射中的 Goolge 映射中删除标记,并且数据对象为空,但出现以下错误。我该如何解决?

错误:

07-12 20:53:05.697: E/AndroidRuntime(26364): FATAL EXCEPTION: IntentService[IntentService]
07-12 20:53:05.697: E/AndroidRuntime(26364): Process: com.bustracker, PID: 26364
07-12 20:53:05.697: E/AndroidRuntime(26364): java.lang.IllegalStateException: Not on the main thread
07-12 20:53:05.697: E/AndroidRuntime(26364):    at com.google.l.a.ce.b(Unknown Source)
07-12 20:53:05.697: E/AndroidRuntime(26364):    at com.google.maps.api.android.lib6.d.ct.a(Unknown Source)
07-12 20:53:05.697: E/AndroidRuntime(26364):    at com.google.maps.api.android.lib6.d.aq.a(Unknown Source)
07-12 20:53:05.697: E/AndroidRuntime(26364):    at com.google.android.gms.maps.model.internal.t.onTransact(SourceFile:51)
07-12 20:53:05.697: E/AndroidRuntime(26364):    at android.os.Binder.transact(Binder.java:380)
07-12 20:53:05.697: E/AndroidRuntime(26364):    at com.google.android.gms.maps.model.internal.zzi$zza$zza.remove(Unknown Source)
07-12 20:53:05.697: E/AndroidRuntime(26364):    at com.google.android.gms.maps.model.Marker.remove(Unknown Source)
07-12 20:53:05.697: E/AndroidRuntime(26364):    at com.bustracker.GetLLRD.onHandleIntent(GetLLRD.java:120)
07-12 20:53:05.697: E/AndroidRuntime(26364):    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
07-12 20:53:05.697: E/AndroidRuntime(26364):    at android.os.Handler.dispatchMessage(Handler.java:102)
07-12 20:53:05.697: E/AndroidRuntime(26364):    at android.os.Looper.loop(Looper.java:145)
07-12 20:53:05.697: E/AndroidRuntime(26364):    at android.os.HandlerThread.run(HandlerThread.java:61)
Run Code Online (Sandbox Code Playgroud)

GetLLRD IntentService 类中的 onHandleIntent 方法:

protected void onHandleIntent(Intent intent) {

                            if (data != null && !data.isEmpty()) {
                                Intent intent1 = new Intent(this, Map.class);
                                intent1.putExtra("list_data", data);
                                intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                                        | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                                startActivity(intent1);

                            } else if (Map.markerMap != null
                                    && !Map.markerMap.isEmpty()) {

                                Iterator<HashMap.Entry<Integer, Marker>> it = Map.markerMap
                                        .entrySet().iterator();
                                while (it.hasNext()) {
                                    HashMap.Entry<Integer, Marker> entery = it
                                            .next();
                                    int key = entery.getKey();
                                    Map.marker = Map.markerMap.get(key);
                                    System.out.println("test marker " + Map.marker ); 
                                    //Line 120.
                                    Map.marker .remove();
                                    Map.markerMap.remove(key);

                                    // Marker value = entery.getValue();
                                }
                            }
Run Code Online (Sandbox Code Playgroud)

地图片段活动:

public class Map extends FragmentActivity implements OnMapReadyCallback {

    GoogleMap map;
    static HashMap<Integer, Marker> markerMap = new HashMap<Integer, Marker>();
    static Marker marker = null;

    ...
    }
Run Code Online (Sandbox Code Playgroud)

Bob*_*der 5

A quick fix for the exception would be to put the map updates in a Runnable to execute on the main thread (code below). However, the real answer to the question is that you need to re-think your design. It is unsafe for code in an IntentService to be using static data in an activity. What are the reasons for using an IntentService? The map updates must run on the main thread. One of the purposes of an IntentService is to perform operations that cannot be done on the main thread, and need a background thread. Why use an IntentService when it contains has code that needs the main thread?

    new Handler(Looper.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
            Iterator<HashMap.Entry<Integer, Marker>> it = Map.markerMap
                    .entrySet().iterator();
            while (it.hasNext()) {
                HashMap.Entry<Integer, Marker> entery = it
                        .next();
                int key = entery.getKey();
                Map.marker = Map.markerMap.get(key);
                System.out.println("test marker " + Map.marker );
                //Line 120.
                Map.marker.remove();
                // Remove from map using iterator
                it.remove();

                // Marker value = entery.getValue();
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)