距离矩阵API异步任务Java

距离矩阵API异步任务Java,java,android,google-maps,android-asynctask,google-distancematrix-api,Java,Android,Google Maps,Android Asynctask,Google Distancematrix Api,我一直在尝试使用距离矩阵API获取两个位置之间的步行持续时间和距离。我想将这些结果(距离和持续时间)存储在我可以从其他类/活动访问的变量中 我设法使用AsyncTask获取时间和持续时间,但当我尝试将它们存储在PostExecute方法的变量中时,当从PostExecute方法之外的方法或类进行访问时,它们总是未分配。现在,我了解了AsyncTask是如何工作的,这就是异步的。我尝试实现接口,然后尝试访问数据,但仍然无法实现 GeoTask是我的Map类中的一个内部类。 public class

我一直在尝试使用距离矩阵API获取两个位置之间的步行持续时间和距离。我想将这些结果(距离和持续时间)存储在我可以从其他类/活动访问的变量中

我设法使用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;
    }


}
分钟和距离变量初始化

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方法访问minutes和distance变量,并且我始终得到返回的值0.0,即使在PostExecution完成之后(我使用日志测试它是否完成)

1) 我怎样才能实现我想要的?在不同的类中访问API返回的距离和持续时间?这对于我正在做的应用程序来说是至关重要的


2) 如果我无法使用AsyncTask和此方法实现我想要的目标,有没有办法在不使用AsyncTask的情况下使用距离矩阵API?

可能您应该在

stringurl=”https://maps.googleapis.com/maps/api/distancematrix/json?origins=“+currentOrigin+”&destinations=“+destinationPassed+”&mode=walking&language=fr-fr&avoid=toll&key=API_-key”

按有效密钥行
API\u KEY
字符


查看以获取有关如何获取有效API密钥的信息。

您是否在
字符串url=。。。回避=通行费&钥匙=API_钥匙”;
?是的,我知道,我做到了。我只是不想让整个互联网都知道我的API钥匙,所以我把它改成了“API_钥匙”“在写关于StackOverflow的问题时:D@RafaelK好啊您可以将URL放在浏览器搜索栏中,并在计算机上分析响应。如果一切正常,我们继续寻找问题。一切正常。我设法解决了这个问题,将它暂时存储在Textview中,然后使用Intent.getExtra在另一个类上访问它。谢谢你的努力@拉斐尔克,一切都是你自己做的。祝你好运
 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);