2016-05-14 2 views
1

Ich bin derzeit ein JsonObject über AsyncHttpClient (loopj) Web-Anfrage anfordern, aber die Anfrage ist eher langsam und ich brauche das Objekt, um fortzufahren. Derzeit stürzt das Programm ab, da das zu speichernde Objekt leer ist und die Speicherfunktion aufgerufen wird, bevor die Webanforderung abgeschlossen ist.(Android | Java) AndroidAsyncHttp (Loopj), um Web-Anfrage abzuschließen, bevor Thread

Hier ist ein Ausschnitt aus meinem Code von dem, was ich versuche zu tun:

btnCreate.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 


      AsyncHttpClient client = new AsyncHttpClient(); 
      String apiAddress = MYAPIADDRESS; 

      client.get(apiAddress, 
        new JsonHttpResponseHandler() { 

         //@Override 
         public void onSuccess(int statusCode, Header[] headers, JSONObject response) { 

          try { 

           JSONObject tempTransition = response.getJSONArray("items").getJSONObject(0).getJSONObject("snippet"); 

           Toast.makeText(getApplicationContext(), tempTransition.get("description").toString(), Toast.LENGTH_SHORT).show(); 

           if(!dirDirectoryJson.contains(tempTransition)){ 
            dirDirectoryJson.add(tempTransition); 
           } 

          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 
         } 

         @Override 
         public void onSuccess(int statusCode, Header[] headers, JSONArray timeline) { 

         } 

         @Override 
         public void onFinish() { 
          // Completed the request (either success or failure) 

         } 

        }); 

       //*** Crashes here **** 
       //dirDirectoryJson returning null object from above due to call before complete web request and crashes the program 
       try { 

        getDescription = dirDirectoryJson.get(0).getString("description").toString().trim(); 
        setDescription(getDescription); 

       } catch (JSONException e) { 
        e.printStackTrace(); 
      } 
    } 

ich SyncHttpClient habe versucht, Gewinde Schlaf etc. sowie gesehen/versucht, diese (und noch viele andere) machen Links,

How to wait for async http to end before continuing?

https://forum.qt.io/topic/5389/how-to-ensure-fully-asynchronous-web-requests

How to wait for all requests to finish

How to make the Main thread wait, when i dont know when will Async task finish the job.?

Ich habe auch versucht, das empfangene Objekt zu rösten, während der Speicherabschnitt des Codes kommentiert wurde. (kommentiert oben) Der Code stürzte nicht ab, aber der Toast erscheint nur nach einer Weile, wenn die Web-Anfrage abgeschlossen ist.

Wie gehe ich vor, um dieses Problem zu lösen? (d. h. erfolgreich das Objekt speichern, ohne die App zu zerstören nur, nachdem die Web-Anfrage abgeschlossen ist). Ich habe sehr lange im Web gesucht, aber keine funktionierende Methode gefunden und ich bin ein Anfänger in Android.

Bitte helfen Sie und lassen Sie mich wissen, wenn weitere Details erforderlich sind. Danke im Voraus!

+0

Welches ist die Speicherfunktion? – Shubhank

+0

@Shubhank Hallo! Ich habe in dem obigen Code tatsächlich kommentiert, im letzten Versuch zu fangen. es stürzt bei der Speicherung ab, bevor das Speichern überhaupt erreicht wird: '(Ich habe die Bearbeitung gemacht, sry für den Tippfehler. – Candiie

+0

bitte verschiebe diesen Code in den On-Erfolg auch – Shubhank

Antwort

0

Da die Anforderung, die Sie ausführen, asynchron ist, sollten Sie die Logik der Verwendung der Antwort der Anforderung in ihrem Beendigungshandler verwenden.

Ihren Code etwas ändern wie

public void onSuccess(int statusCode, Header[] headers, JSONObject response) { 

try { 

    JSONObject tempTransition = response.getJSONArray("items").getJSONObject(0).getJSONObject("snippet"); 

    Toast.makeText(getApplicationContext(), tempTransition.get("description").toString(), Toast.LENGTH_SHORT).show(); 

    if(!dirDirectoryJson.contains(tempTransition)){ 
      dirDirectoryJson.add(tempTransition); 
    } 

    getDescription = dirDirectoryJson.get(0).getString("description").toString().trim(); 
       setDescription(getDescription); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 

Auch Ihre Variablen wie beispielsweise var machen (dh sie bei Klassenbereich deklarieren), wenn zeigt nicht final Variablen innerhalb des Handler

zugreifen kann nicht
0

Da Async-Aufrufe im Hintergrund ausgeführt werden, wird der verbleibende Code ausgeführt, bevor die Daten tatsächlich gespeichert werden.

getDescription=dirDirectoryJson.get(0).getString("description").toString().trim(); 
       setDescription(getDescription); 

schreiben Sie diese Zeilen in Ihre onSuccess-Methode, damit es funktioniert.

+0

Hallo, ich habe es versucht, es sagt meine Variablen, getDescription & setDescription müssen endgültig erklärt werden, aber ich kann sie nicht als endgültig erklären, da ich die Daten bearbeiten muss. – Candiie

+0

dann setzen Sie diesen Code in eine andere benutzerdefinierte Methode und rufen Sie diese Methode in OnSuccess-Methode. –

+0

Hallo ich habe es schon funktioniert! Von @ Shubhank's Antwort denke ich, dass deine Methode auch funktionieren würde, aber da er zuerst geantwortet hat, muss ich ihn als ans setzen. Trotzdem vielen Dank! – Candiie

Verwandte Themen