我正在构建一个 Android 应用程序,并且我正在使用 Geocoder 来解码位置,但我注意到有时当连接性相对较低时,Gecoder 无法工作。但与此同时,浏览器和其他基于互联网的应用程序仍然可以运行。有没有什么办法解决这一问题 ?这可能出了什么问题。我确实知道它是一个后端服务,但这并不重要。对于常规的 http 请求,我们可以重试并修复类似的问题,但我该如何解决这个问题?有什么建议吗?
class ReverseGeocodingTask extends AsyncTask<Double, Void, String> implements OnDismissListener{
Context context;
ProgressDialog progDialog;
String progressString;
public ReverseGeocodingTask(Context context, String progressStr) {
this.context = context;
this.progressString = progressStr;
if(!isCancelled()){
initProgDialog();
}
}
void initProgDialog(){
progDialog = new ProgressDialog(context);
progDialog.setCanceledOnTouchOutside(false);
progDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.btn_cancel),new DialogInterface.OnClickListener() {
public void onClick(final DialogInterface dialog, final int id) {
progDialog.dismiss();
}
});
progDialog.setMessage(progressString);
progDialog.setOnDismissListener(this);
progDialog.show();
}
@Override
protected void onPreExecute() {
//removeAllPendingRevGeocodingTasks();
addTask(this);
super.onPreExecute();
}
@Override
protected String doInBackground(Double... params) {
String result = null;
if(!isCancelled()){
Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());
try {
List<Address> list = geocoder.getFromLocation(latitude, longitude, 1);
if (list != null && list.size() > 0) {
Address address = list.get(0);
result = address.getAddressLine(0) + ", " + address.getLocality();
}
} catch (IOException e) {
progDialog.dismiss();
failedToUpdateLocation();
Log.e("Location listener", "Failed to decode location name");
}
}
return result;
}
@Override
protected void onCancelled() {
progDialog.dismiss();
this.cancel(true);
super.onCancelled();
}
@Override
protected void onPostExecute(String result) {
latLongInDegrees = " "+latLongInDegreesToDMSString(latitude,longitude);
setLocationName(result);
updateLocationName(result + latLongInDegrees);
String progressStr=getString(R.string.msg_slp_fetch_from_geocoder_result_1)+latLongInDegreesToDMSString(latitude,longitude)+"...";
executeSLPWebserviceTask(latitude, longitude, progressStr);
finishedUpdatingLocation(latitude,longitude);
progDialog.dismiss();
super.onPostExecute(result);
this.cancel(true);
//removeAllPendingRevGeocodingTasks();
}
public void onDismiss(DialogInterface dialog) {
this.cancel(true);
}
}
protected void executeRevGeocoderTask(double lat, double longitude)
{
String progressStr=getString(R.string.msg_rev_geocoder_fetch)+" "+latLongInDegreesToDMSString(lat,longitude);
ReverseGeocodingTask task = new ReverseGeocodingTask(this,progressStr);
task.execute(lat,longitude);
}
最佳答案
Geocoder 是一项后端服务,我们对其 http 请求或任何此类请求没有任何句柄。它需要良好的互联网连接。
关于android - 地理编码器的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9679144/