2016-05-06 12 views
0

Ich mache eine Android-App und ich muss eine JSONObjectRequest machen, um einen Parameter (logo) von einem package.json in einem Github-Repository zu erhalten.Synchronisation mit JSONObjectRequest (Android)

Dies ist die Methode, wo ich die JSON Anfrage

public void askLogoPath(String url) { 

    JsonObjectRequest req = new JsonObjectRequest(url, 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        try { 
         if (response.has("logo")) 
          Global.getInstance().setLogo(response.getString("logo")); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 

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

    // Adding request to request queue 
    QueueController.getInstance().addToRequestQueue(req); 

} 

machen habe ich eine Variable definiert (logo) in Global Klasse, das Singleton-Muster folgt, so kann ich es überall in meinem Programm zugreifen. Nachdem ich diese Anfrage gestellt habe, möchte ich eine Variable mit dem Wert des Logos setzen.

Dies ist das Stück Code, wo ich die vorherige Funktion aufrufen.

if (full_name != null) { 
     String url = "https://raw.githubusercontent.com/" + full_name + "/master/"; 
     this.askLogoPath(url + "package.json"); 
     this.setLogoPath(Global.getInstance().getLogo()); 
} 

Ich habe bemerkt, dass die onResponse Teil der letzte, ausgeführt werden soll, so, wenn ich setLogoPath(Global.getInstance.getLogo()) Logo zu tun ist immer noch null, so kann ich nicht logoPath in der vorherigen Zeile gesetzt. Ich würde gerne warten, bis dies ausgeführt wird, also wird es nicht null sein.

Gibt es eine Möglichkeit, es synchron zu machen, damit ich das tun kann?

Vielen Dank

Antwort

0

Es wurde durch Hinzufügen eines Rückrufs gelöst. Wenn die Anforderung JSON eine Antwort empfängt, ruft sie die Methode onSuccess() der Rückruffunktion auf, und in der Hauptfunktion befindet sich der Rest des Codes in dieser onSuccess()-Methode.

0

Da Sie es tun wollen synchron können Sie einen Thread, um den Prozess zu sperren, bis er

new Thread(new Runnable() { 
     @Override 
     public void run() { 
      //set your logo 
     } 
    }).start(); 

abgeschlossen ist, wenn Sie nichts dagegen haben es asynchron eine AsyncTask verwenden tun . Theres viele Beispiele über die Bahn

0

Sie können diese Codezeile aufrufen:

this.setLogoPath(Global.getInstance().getLogo()); 

Auf Reaktion Ihres AsyncTask. So können Sie diese Funktion onComplete() Ihrer AsyncTask ausführen.