尝试 运行 新线程添加 Google 地图标记时崩溃

Crash when trying to run a new thread to add Google Maps markers

我正在尝试启动一个新线程,以便在解析 JSON 响应并将其存储在哈希图中后在地图上添加标记。完成此异步任务后,我想通过遍历哈希图值并使用 addMarkers() 在地图上添加新标记。当我 运行 我的应用程序崩溃时,我得到了这个错误。

Logcat 错误:

at com.google.k.a.cj.b(Unknown Source)
at com.google.maps.api.android.lib6.c.ca.a(Unknown Source)
at com.google.maps.api.android.lib6.c.el.a(Unknown Source)
at com.google.android.gms.maps.internal.l.onTransact(SourceFile:167)
at android.os.Binder.transact(Binder.java:361)
at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.addMarker(Unknown Source)
at com.google.android.gms.maps.GoogleMap.addMarker(Unknown Source)
at com.example.test.testapp.MapsActivity$ParseJSON.run(MapsActivity.java:169)

MapsActivity

public class ParseJSON extends AsyncTask<String, Void, Void>
{
    @Override
    protected Void doInBackground(String... params)
    {
        try
        {
            HttpClient client = new DefaultHttpClient();
            HttpPost post = new HttpPost(params[0]);

            HttpResponse response = client.execute(post);
            int status = response.getStatusLine().getStatusCode();
            if(status == 200)
            {
                HttpEntity entity = response.getEntity();
                String data = EntityUtils.toString(entity);

                String noHTML = stripHtml(data);

                JSONArray jsonArray = new JSONArray(noHTML);

                for(int i = 0; i < jsonArray.length(); i++)
                {
                    NearbyStops stops = new NearbyStops();
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    String id = jsonObject.getString("ID");
                    stops.name = jsonObject.getString("Name");
                    stops.lat = jsonObject.getDouble("Lat");
                    stops.lng = jsonObject.getDouble("Long");

                    stopHash.put(id, stops);
                }
            }
        }
        catch (ClientProtocolException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        catch (JSONException e)
        {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result)
    {
        Thread addMarkers = new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                for(NearbyStops value : stopHash.values())
                {
                    MarkerOptions markerOptions = new MarkerOptions();

                    String name = value.name;
                    double lat = value.lat;
                    double lng = value.lng;

                    LatLng latLng = new LatLng(lat, lng);
                    markerOptions.position(latLng);
                    markerOptions.title(name);
                    mMap.addMarker(markerOptions);
                }
            }
        });
        addMarkers.start();
    }
}

我有疑问,因为您正在访问 Worker Thread 上的 mMap Google Map 对象。因此,只需删除 onPostExecute() 中的 addMarkers Thread 并直接放置 for 循环以在 onPostExceute() 中添加标记并且您正在引用一些对象,例如 stopHash in addMarker Thread 这是无法访问(意味着您引用的 stopHash 中没有任何值,或者可能是 null)。