Android全局范围字符串返回null

时间:2016-06-09 05:15:32

标签: android string

我在类级别声明了一个String。

String eta;

我正在将一个url传递给同一个类中的一个方法,该方法将使用volley来检索来自Google apis之一的距离。然后我将响应String分配给我的全局变量eta。它在方法中具有所需的值,但返回时全局值为null。我无法理解这种行为。我在这做错了什么?

public String getDuration(String url){
        RequestQueue queue = Volley.newRequestQueue(this);

        JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                try {
                    String  j = response.getString("rows");
                    JSONArray rowa = new JSONArray(j);
                    JSONObject rowobj = rowa.getJSONObject(0);
                    JSONArray elementsa = rowobj.getJSONArray("elements");
                    for (int i = 0; i < elementsa.length(); i++) {
                        JSONObject currentObject = elementsa.getJSONObject(i);
                        String duration = currentObject.getString("duration_in_traffic");
                        JSONObject timeObject = new JSONObject(duration);
                        **eta = timeObject.getString("text"); //eta has the needed value**
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
            }
        });
        queue.add(jsObjRequest);
        **return eta; //here eta is null**
    }

1 个答案:

答案 0 :(得分:0)

onResponse(JSONObject response)是异步的。

您正在调用getDuration(String url)并设置将在网络操作结束时调用的侦听器。 您没有等待侦听器被调用,而是返回值(此时未设置)以及为什么您获得空值。

onResponse(JSONObject response)内,你应该调用需要eta值的方法。

public void getDuration(String url){
    RequestQueue queue = Volley.newRequestQueue(this);

    JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                String  j = response.getString("rows");
                JSONArray rowa = new JSONArray(j);
                JSONObject rowobj = rowa.getJSONObject(0);
                JSONArray elementsa = rowobj.getJSONArray("elements");
                for (int i = 0; i < elementsa.length(); i++) {
                    JSONObject currentObject = elementsa.getJSONObject(i);
                    String duration = currentObject.getString("duration_in_traffic");
                    JSONObject timeObject = new JSONObject(duration);
                    eta = timeObject.getString("text"); //eta has the needed value**
                    methodThatUsesValue(eta);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
        }
    });
    queue.add(jsObjRequest);
}