应用程序停止响应多个地理编码器请求
App stops responding on multiple geocoder requests
应用程序停止响应一段时间,然后恢复正常并显示所有标记。即使列表大小为 30,该应用也会挂起。这是我的代码,
private void addMarkersByPlace(List<JSONObject> data_arr){
try {
for (int i = 0; i < data_arr.size(); i++) {
List<Address> addresses = geoCoder.getFromLocationName(data_arr.get(i).getString("position"), 1);
if (addresses.size() > 0) {
LatLng position = new LatLng(addresses.get(0).getLatitude()+(Math.random()/200),addresses.get(0).getLongitude()+(Math.random()/200));
Bitmap bmImg = Ion.with(this).load(data_arr.get(i).getString("icon")).asBitmap().get();
mMap.addMarker(new MarkerOptions()
.position(position)
.title(data_arr.get(i).getString("title"))
.snippet(data_arr.get(i).getString("snippet"))
.icon(BitmapDescriptorFactory.fromBitmap(bmImg))
);
}
}
progress.dismiss();
}
catch (Exception e){
txt_msg.setText("ERROR : "+ e.toString());
}
}
如有任何帮助,我们将不胜感激。
您的主线程做太多工作,这可能会导致 ANR。
创建一个AsyncTask(documentation)查询地理编码器并在onPostExecute
方法上绘制Markers
(标记必须在主线程上绘制)。
你的AsyncTask
可以这样(未测试):
private class QueryGeocoder extends AsyncTask<List<JSONObject>, Integer, List<Address>> {
@Override
protected List<Address> doInBackground(List<JSONObject>... objects) {
List<Address> addresses = new ArrayList<>();
try {
for (JSONObject object : objects) {
addresses.add(geoCoder.getFromLocationName(object.getString("position"), 1));
}
}
catch (Exception e){
}
return addresses;
}
protected void onPostExecute(List<Address> result) {
for (Address address : result) {
LatLng position = new LatLng(address.getLatitude()+(Math.random()/200),address.getLongitude()+(Math.random()/200));
Bitmap bmImg = Ion.with(this).load(address.getString("icon")).asBitmap().get();
mMap.addMarker(new MarkerOptions()
.position(position)
.title(address.getString("title"))
.snippet(address.getString("snippet"))
.icon(BitmapDescriptorFactory.fromBitmap(bmImg))
);
}
}
}
你可以这样执行:
new QueryGeocoder().execute(data_arr);
应用程序停止响应一段时间,然后恢复正常并显示所有标记。即使列表大小为 30,该应用也会挂起。这是我的代码,
private void addMarkersByPlace(List<JSONObject> data_arr){
try {
for (int i = 0; i < data_arr.size(); i++) {
List<Address> addresses = geoCoder.getFromLocationName(data_arr.get(i).getString("position"), 1);
if (addresses.size() > 0) {
LatLng position = new LatLng(addresses.get(0).getLatitude()+(Math.random()/200),addresses.get(0).getLongitude()+(Math.random()/200));
Bitmap bmImg = Ion.with(this).load(data_arr.get(i).getString("icon")).asBitmap().get();
mMap.addMarker(new MarkerOptions()
.position(position)
.title(data_arr.get(i).getString("title"))
.snippet(data_arr.get(i).getString("snippet"))
.icon(BitmapDescriptorFactory.fromBitmap(bmImg))
);
}
}
progress.dismiss();
}
catch (Exception e){
txt_msg.setText("ERROR : "+ e.toString());
}
}
如有任何帮助,我们将不胜感激。
您的主线程做太多工作,这可能会导致 ANR。
创建一个AsyncTask(documentation)查询地理编码器并在onPostExecute
方法上绘制Markers
(标记必须在主线程上绘制)。
你的AsyncTask
可以这样(未测试):
private class QueryGeocoder extends AsyncTask<List<JSONObject>, Integer, List<Address>> {
@Override
protected List<Address> doInBackground(List<JSONObject>... objects) {
List<Address> addresses = new ArrayList<>();
try {
for (JSONObject object : objects) {
addresses.add(geoCoder.getFromLocationName(object.getString("position"), 1));
}
}
catch (Exception e){
}
return addresses;
}
protected void onPostExecute(List<Address> result) {
for (Address address : result) {
LatLng position = new LatLng(address.getLatitude()+(Math.random()/200),address.getLongitude()+(Math.random()/200));
Bitmap bmImg = Ion.with(this).load(address.getString("icon")).asBitmap().get();
mMap.addMarker(new MarkerOptions()
.position(position)
.title(address.getString("title"))
.snippet(address.getString("snippet"))
.icon(BitmapDescriptorFactory.fromBitmap(bmImg))
);
}
}
}
你可以这样执行:
new QueryGeocoder().execute(data_arr);