尝试 运行 新线程添加 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
)。
我正在尝试启动一个新线程,以便在解析 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
)。