Я пытался определить продолжительность и расстояние ходьбы между двумя точками, используя API-интерфейс Distance Matrix. Я хочу сохранить эти результаты (расстояние и продолжительность) в переменных, к которым я смогу получить доступ из других классов / занятий.
Мне удалось получить время и продолжительность, используя AsyncTask, но когда я пытаюсь сохранить их в переменной в методе PostExecute, они всегда не назначаются при доступе из метода или класса вне метода PostExecute. Теперь я понимаю, как работает AsyncTask, и это асинхронно. Я пытался реализовать интерфейсы, а затем пытался получить доступ к данным, но все же не смог.
GeoTask - это внутренний класс в моем классе Map.
public class GeoTask extends AsyncTask<String, Void, String> {
ProgressDialog pd;
Context mContext;
SelectTime selectTime;
//constructor is used to get the context.
public GeoTask(Context mContext) {
this.mContext = mContext;
}
public GeoTask() {
}
//This function is executed before before "doInBackground(String...params)" is executed to dispaly the progress dialog
@Override
protected void onPreExecute() {
super.onPreExecute();
selectTime=new SelectTime();
pd=new ProgressDialog(mContext);
pd.setMessage("Loading");
pd.setCancelable(false);
pd.show();
}
//This function is executed after the execution of "doInBackground(String...params)" to dismiss the dispalyed progress dialog and call "setDouble(Double)" defined in "MainActivity.java"
@Override
protected void onPostExecute(String aDouble) {
super.onPostExecute(aDouble);
if(aDouble!=null)
{
setDouble(aDouble);
}
else
Toast.makeText(mContext, "Error4!Please Try Again with proper values", Toast.LENGTH_SHORT).show();
}
@Override
protected String doInBackground(String... params) {
try {
URL url=new URL(params[0]);
HttpURLConnection con= (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
con.connect();
int statuscode=con.getResponseCode();
if(statuscode==HttpURLConnection.HTTP_OK)
{
BufferedReader br=new BufferedReader(new InputStreamReader(con.getInputStream()));
StringBuilder sb=new StringBuilder();
String line=br.readLine();
while(line!=null)
{
sb.append(line);
line=br.readLine();
}
String json=sb.toString();
Log.d("JSON",json);
JSONObject root=new JSONObject(json);
JSONArray array_rows=root.getJSONArray("rows");
Log.d("JSON","array_rows:"+array_rows);
JSONObject object_rows=array_rows.getJSONObject(0);
Log.d("JSON","object_rows:"+object_rows);
JSONArray array_elements=object_rows.getJSONArray("elements");
Log.d("JSON","array_elements:"+array_elements);
JSONObject object_elements=array_elements.getJSONObject(0);
Log.d("JSON","object_elements:"+object_elements);
JSONObject object_duration=object_elements.getJSONObject("duration");
JSONObject object_distance=object_elements.getJSONObject("distance");
Log.d("JSON","object_duration:"+object_duration);
return object_duration.getString("value")+","+object_distance.getString("value");
}
} catch (MalformedURLException e) {
Log.d("error", "error1");
} catch (IOException e) {
Log.d("error", "error2");
} catch (JSONException e) {
Log.d("error","error3");
}
return null;
}
}
В Класс карты , метод setDouble:
public void setDouble(String result) {
String res[] = result.split(",");
Double m = Double.parseDouble(res[0]) / 60;
Double d = Double.parseDouble(res[1])/1000;
minutes=m
distance=d
}
Инициализация переменных минут и расстояний
private double minutes;
public double getMinutes() {
return minutes;
}
private double distance;
public double getDistance() {
return distance;
}
и выполнение:
LatLng destinationLatLng = getLatLngFromAddress(destinationPassed);
currentOrigin = getAddressFromLatLng(currentLat,currentLong);
String url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" + currentOrigin + "&destinations=" + destinationPassed + "&mode=walking&language=fr-FR&avoid=tolls&key=API_KEY";
Log.d("url string",url);
geoTask.execute(url);
Кроме того, я пытаюсь получить доступ к переменным минут и расстояний, используя методы get в другом классе, и получаю значение 0.0, возвращаемое все время, даже после завершения PostExecution (я проверял, что оно завершено с использованием журналов)
1) Как мне добиться того, чего я хочу? Доступ к расстоянию и длительности, возвращаемым API в разных классах? Для приложения, которое я делаю, очень важно добиться этого.
2) Если я не могу достичь того, что хочу, используя AsyncTask и этот метод, есть ли способ использовать API-интерфейс Distance Matrix без AsyncTask?