0

Ich möchte eine Aktivität haben, die REST API verbraucht mit der Volley-Bibliothek, unterdessen zeigt ein benutzerdefiniertes Layout (in XML-Layout-Datei geschrieben) auf dem Bildschirm.Aktivität verbraucht REST Webservice mit Volley-Bibliothek zeigt nicht Layout geladen von XML (über setContentView())

Also habe ich eine Aktivität geschrieben, die in ihrer onCreate() setContentView(R.layout.layout_file); wie üblich aufruft. Die danach, es verbraucht die REST API durch Volley-Bibliothek (d. H. Baut das Volley RequestQueue Objekt auf und ruft dann requestQueueObject.add(requestObject) darauf auf).

Die (relevanten Teile des) Codes sind wie folgt angegeben.

Das Problem ist, dass während die Daten aus dem API REST heruntergeladen werden, das Layout aus der XML-Layout-Datei geladen mit setContentView() (in onCreate()vor den REST Web-Service raubend) wird nicht auf dem Bildschirm angezeigt und der Bildschirm bleibt leer. Danach wird das in XML definierte Layout für einen Augenblick angezeigt, und dann wird die nächste Aktivität AnotherActivity gestartet.

Wenn ich bei der nächsten Aktivität die Zurück-Schaltfläche drücke, wird das in der XML-Datei festgelegte Layout in der ersten Aktivität angezeigt.

Wie behebe ich dieses Problem? daher dieses Problem

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_first); 

     PreferenceManager.setDefaultValues(this, R.xml.preferences, false); 

     RequestQueue requestQueue = RequestQueueSingleton.getInstance(getApplicationContext()).getRequestQueue(); 
     JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, URL, 
       new Response.Listener<JSONObject>() { 
        @Override 
        public void onResponse(JSONObject jsonObject) { 
         ... 
        } 
       }, new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         ... 
        } 
       }); 

     requestQueue.add(request); 

     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     startActivity(new Intent(this, AnotherActivity.class)); 
    } 
+1

Ich denke, die Frage ist hier, weil Sie 'Thread.sleep nennen (5000);' vom Hauptthread innerhalb der 'onCreate' Stufe –

+0

@AleksandrMedvedev Nein, das ist nur eine Überprüfung, die ich hinzugefügt habe, um sicherzustellen, dass das Laden von Layout aus XML tatsächlich verzögert wird, solange die REST-API verbraucht wird. – Solace

+1

Warum haben Sie Ihre Aktivität beim Rückruf nicht gestartet? Wenn ich dich richtig verstanden habe, wartest du auf die Antwort? – once2go

Antwort

1

Sie sollten ein wenig mehr über Acitivity Lebenszyklus und Threads lernen.

Zuerst - Sie sehen die Aktivität nicht bis zur onResume Bühne. Während Sie also den Thread innerhalb der onCreate Bühne schlafen lassen, kann onResume nicht erreicht werden (deshalb sehen Sie den leeren Bildschirm).

Sekunde - Sie sollten sich nicht auf das Timing verlassen, um herauszufinden, wann die Anfrage beendet ist. Stattdessen startet die gewünschte Aktivität innerhalb der Callback-Methoden (Response.Listener<JSONObject> und/oder Response.ErrorListener())

1

onCreate Sie für 5 Sekunden den Faden Schlaf machen. Sie können, indem sie die folgenden Änderungen das Problem beheben:

Ersetzen Sie diesen Code:

try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     startActivity(new Intent(this, AnotherActivity.class)); 

von:

new Handler().postDelayed(
       new Runnable() { 
        @Override 
        public void run() { 
         startActivity(new Intent(this, AnotherActivity.class)); 
        } 
       }, 5000); 

Ich vermute, Sie versuchen, Splash-Screen Art zu erreichen Funktionalität, sollte diese Lösung dafür arbeiten.

+0

Ja Ich versuche, Splash-Screen-Funktionalität hinzuzufügen. Aber 'Thread.sleep()' ist nur eine Überprüfung, die ich hinzugefügt habe, um sicher zu sein, dass das Laden/Anzeigen von Layout aus XML nur so lange verzögert wird, wie REST API verbraucht wird. Ich bin zufrieden damit, den ganzen Schlaf des Fadens loszuwerden. – Solace

+1

Dieser Rest-API-Anruf ist ein weiterer Thread und verzögert daher den Start einer anderen Aktivität nicht. Aber ja, wenn Sie Ihre Aktivität onResponse() der API starten, wird der Start verzögert, bis eine API-Antwort empfangen wurde. –