7 Stimmen

Initialisierung einer Android-Anwendung

Ich stehe derzeit vor folgendem Problem: w

Bislang habe ich diesen Initialisierungscode in eine SplashScreen-Aktivität eingefügt, die ich im Manifest als MAIN-Aktivität deklariert habe. Sobald der Initialisierungscode ausgeführt wurde, beende() ich den Splashscreen und starte die eigentliche Hauptaktivität, d.h. eine Aktivität, die aus mehreren Registerkarten besteht, von denen aus der Benutzer mehrere andere Aktivitäten erreichen kann.

Das Problem ist nun folgendes: Wenn meine Anwendung in den Hintergrund gestellt wird, wird nach einiger Zeit und nach dem Start anderer Anwendungen meine Anwendung/ mein Prozess beendet. Wenn ich sie vom Homescreen aus neu starte, stellt Android den Aktivitätsstapel (Task) wieder her und ruft onCreate() für sie auf. Die Splashscreen-Aktivität und damit der Initialisierungscode werden jedoch nicht ausgeführt, was zu einer Ausnahme führt.

Ich könnte nun den Initialisierungscode in die onCreate() der Anwendung einfügen, was jedoch zu einem schwarzen Bildschirm führt, bis die Methode abgeschlossen ist.

Hat jemand eine Idee, wo und wie ich meine App beim Start richtig initialisieren kann?

Initialisierungscode:

public void init() {
    if (initialized) {
        return;
    }

    // Initialize terms
    List<Tag> tags= DynamicDao.loadAll(Tag.class);
    int numTags = tags.size();
    terms = new String[numTags];
    for (int i = 0; i < numTags; i++) {
        terms[i] = tags.get(i).getTag();
    }

    // Initialize document-term matrix
    List<Item> items = DynamicDao.loadAll(Item.class);
    createDocumentTermMatrix(items);

    initialized = true;
}

Hinweis: Ein Element hat mehrere zugehörige Tags, aus denen ich einen Dokumentenvektor erstellen muss.

3voto

EboMike Punkte 74805

Wie teuer ist Ihre Initialisierung? Was machen Sie dort? Im Allgemeinen würde ich davon abraten, einen Startbildschirm zu verwenden (es handelt sich um eine mobile Anwendung, nicht um eine Desktop-Anwendung). Verwenden Sie stattdessen einen Worker-Thread, um Ihre Daten zu initialisieren, während die Haupt-UI angezeigt wird, und verwenden Sie dann Handler, um die UI zu initialisieren, sobald Ihr Worker-Thread fertig ist.

Alternativ dazu würde ich untersuchen, warum die Initialisierung so lange dauert, und sie optimieren. Was machen Sie da?

2voto

lucabox Punkte 113

Wenn Sie wirklich eine lang andauernde Operation durchführen müssen, sollten Sie die AsyncTask . Es ist wirklich einfach zu benutzen, es bietet Ihnen zwei Funktionen namens onPreExecute y onPostExecute die im Haupt-Thread jeweils vor und nach der Operation aufgerufen werden. All die teuren Sachen sollten in doInBackground der im Worker-Thread arbeitet.

Während des Vorgangs können Sie einen Fortschrittsdialog anzeigen (den Sie innerhalb des oben erwähnten onPreExecute ), die den Fortschritt Ihrer Arbeit mit Hilfe eines der angebotenen Rückrufe anzeigen: onProgressUpdate werden Sie den Dialog in der oben erwähnten Innenseite schließen onPostExecute

0voto

BenTobin Punkte 1201

Wenn Sie Ihren aktuellen Startbildschirm beibehalten möchten, haben Sie mehrere Möglichkeiten.

Wenn Ihre Datenstruktur nicht zu riesig ist, können Sie sie in onSaveInstanceState speichern und in onRestoreInstanceState und/oder onPostCreate wiederherstellen.

Wenn die Daten zu groß sind, müssen Sie vielleicht nur prüfen, ob Ihre Anwendung in onResume oder einer der anderen verschiedenen Startmethoden wie onRestart, onStart usw. initialisiert wird (

Die Ratschläge der anderen zu diesem Thema sind ebenfalls gut. Aber wenn Sie eine schnelle Lösung brauchen, ist das vielleicht das Richtige für Sie.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X