2016-06-09 9 views
0

Ich habe einen String auf Klassenebene deklariert.Globaler Android-Bereich String gibt null zurück

String eta; 

ich vorbei eine URL auf ein Verfahren in der gleichen Klasse, die Volley Abstand zum Abrufen von einer Google-APIs verwenden. Ich weise dann die Response String meiner globalen Variable eta zu. Es hat den erforderlichen Wert innerhalb der Methode, aber der globale Wert ist null, wenn es zurückgegeben wird. Ich kann dieses Verhalten nicht verstehen. Was mache ich hier falsch?

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** 
    } 
+2

Ihr 'JsonObjectRequest' läuft asynchron, so dass die' onResponse() 'Methode wird jedoch nicht vor der' getDuration() 'Methode zurück laufen. –

+0

@Mike M, macht es voll und ganz Sinn. Wie kann ich das umgehen? –

+1

Gib nichts von 'getDuration()' zurück. Tun Sie stattdessen am Ende der 'onResponse()' Methode, was immer Sie mit 'eta' machen wollen. –

Antwort

0

onResponse(JSONObject response) ist asynchron.

Sie rufen getDuration(String url) an und legen einen Listener fest, der beim Beenden des Netzwerkvorgangs aufgerufen wird. Anstatt darauf zu warten, dass der Listener angerufen wird, geben Sie den Wert zurück (der im Moment nicht gesetzt ist) und deshalb erhalten Sie einen Nullwert.

Innerhalb onResponse(JSONObject response) sollten Sie die Methode aufrufen, die ETA-Wert benötigt.

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); 
} 
+0

Ich habe meinen Code im Einklang mit der asynchronen Natur der Callback- und Polymorphismus-Prinzipien geändert. Ich schätze jeden, der mich gegeben und geantwortet hat. –