2012-04-09 10 views
0

Ich habe Probleme, dieses Problem in durchsuchbare Begriffe zu setzen. Ich arbeite an einer Android-Anwendung und speziell dem Startbildschirm für meine App. Die App muss Daten von einem externen Webdienst (einen blockierenden Funktionsaufruf) abrufen, während der Benutzer einen schönen Titel, Bild und Fortschrittsbalken erhält. Wenn die Daten ankommen, wird der Benutzer zum Hauptmenü umgeleitet. Es ist ein einfacher Bildschirm, alles ist in der XML-Layout-Datei definiert, mein Problem ist, dass ich nur für ein paar Sekunden einen schwarzen Bildschirm und dann das Hauptmenü bekomme. Wenn ich zurück drücke, bekomme ich den Begrüßungsbildschirm mit dem Fortschrittsbalken, der sich fröhlich dreht.Android Dev: Android-Layout wird nicht in der Zeit gezeichnet

Hier ist, was ich bisher:

public class SplashActivity extends Activity{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.splash); 
    } 

    @Override 
    public void onStart(){ 
     super.onStart(); 
     DatabaseManager db = new DatabaseManager(this.getBaseContext()); 
     db.fetchExternCatalog(); //doesnt return until data arrives 
     Intent intent = new Intent().setClass(this, MainMenuActivity.class); 
     startActivity(intent); 
    } 
} 

Es scheint der Bildschirm ist nicht gezeichnet tatsächlich, bis die Tätigkeit ausgeführt wird (nach onCreate(), onStart(), etc). Ich dachte an Start() wäre der perfekte Ort, um dies zu setzen, aber anscheinend nicht.

Also, wie zeichne ich alles auf dem Bildschirm und mache meine Sperrfunktion Anruf nach, so dass der Benutzer tatsächlich den Begrüßungsbildschirm sieht, während die Daten heruntergeladen werden?

+0

Sieht aus wie ich die Antwort auf meine eigene Frage gefunden haben an der entsprechenden Liste auf der Seite sah sollte (noch irgendwie neu hier ha) vor der Veröffentlichung: http: // Stackoverflow. com/questions/1979524/android-splashscreen, hat den Trick – macgregor

Antwort

0

Du wirst die UI-Thread zu Perren der Grund, warum ich glaube, ist ein schwarzer sehen Bildschirm. Verwenden Sie eine AsyncTask oder erstellen Sie einen eigenen Thread-Pool für DB-Operationen.

So weit wie die Zurück-Taste drücken und Ihre alte Aktivität zu sehen, müssen Sie Android sagen, nicht die Aktivität in seinem Stack zu speichern. Dies sollte helfen:

http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html

+0

Das ist, was ich getan habe, war im Begriff, auf der Rückseite Knopf Teil zu bekommen. Ich sehe mir diesen Link an, danke. – macgregor

0

Sie müssen die ProgressDialog-Klasse verwenden, um das Dialogfeld zu erstellen, und führen Sie dann die Blockierungsmethode innerhalb eines Threads aus.

ich ein Beispiel, in einer Minute abgeben werde (Gotta in der Nähe eines PC bekommen: p)

private void showSplash(){ 

    progressDialog = ProgressDialog.show(this, "Hello! ima title", "Im the message you see."); 
    progressDialog.show(); 

    Thread t = new Thread(new Runnable(){     
     public void run(){ 
      // Put your blocking method here. 
      // You may need to build in a "hey, im done downloading" variable to get it to close down right 
    progressDialog.dismiss(); 
    } 
}); 
t.start(); 
} 
+0

Können Sie Bilder hinzufügen und was nicht zu ProgressDialog? Ich nehme an, Sie könnten, wenn Sie Ihre eigene Unterklasse machen, aber das scheint mehr Arbeit als für einen Splash-Bildschirm so einfach zu sein. – macgregor

+0

Sie sollten in der Lage sein, ein Bild über setContentView() hinzuzufügen (habe es nie selbst versucht). Ich glaube, Sie müssen nur den Nachrichtenteil entfernen, damit er nicht mit dem Inhalt kollidiert. – z3nful

+0

Ich könnte versuchen, dass später, könnte einige Ressourcen Overhead speichern eine separate Aktivität erstellen würde – macgregor