Android 应用程序停止响应多个地理编码器请求

Android 应用程序停止响应多个地理编码器请求,android,google-maps,google-maps-markers,google-geocoder,Android,Google Maps,Google Maps Markers,Google Geocoder,应用程序停止响应一段时间,然后使用所有标记恢复正常。即使列表大小为30,应用程序也会挂起。这是我的密码 private void addMarkersByPlace(List<JSONObject> data_arr){ try { for (int i = 0; i < data_arr.size(); i++) { List<Address> addresses = geoCoder.getFromLocation

应用程序停止响应一段时间,然后使用所有标记恢复正常。即使列表大小为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());
    }
}
private void addMarkersByPlace(列出数据){
试一试{
对于(int i=0;i0){
LatLng position=new LatLng(addresses.get(0).getLatitude()+(Math.random()/200),addresses.get(0).getLongitude()+(Math.random()/200));
位图bmImg=Ion.with(this).load(data_arr.get(i).getString(“icon”)).asBitmap().get();
mMap.addMarker(新标记选项()
.职位(职位)
.title(data_arr.get(i).getString(“title”))
.snippet(数据\u arr.get(i).getString(“snippet”))
.icon(BitmapDescriptorFactory.fromBitmap(bmImg))
);
}
}
进步。解散();
}
捕获(例外e){
txt_msg.setText(“错误:+e.toString());
}
}

任何帮助都将不胜感激。

您的主线程做了太多的工作,这可能会导致ANR

创建一个AsyncTask(),用于查询地理编码器并在
onPostExecute
方法上绘制
标记(标记必须绘制在主线程上)

您的
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);