2012-06-05 2 views
6

Ich habe einen Hintergrunddienst, der innerhalb einer Transaktion einmal täglich schwer belastet wird. Wenn der Benutzer die App zu diesem Zeitpunkt startet, möchte ich, dass sie bis zum Ende fest sitzt (ca. 10 Sekunden oder so). Was ist der beste Weg, dies bei allen Aktivitäten zu tun? Überprüfen Sie, ob der Dienst in der Funktion "onResume" für jede Aktivität ausgeführt wird. Und woher wissen wir, wann es fertig ist? Lokale Übertragungen, die ich rate ...Der beste Weg zum Einfrieren und zur Anwendung, während die Datenbank einige schwere Hintergrundarbeit leistet?

Best Practices jemand?

UPDATE: Ich habe es geschafft, "onResume" zu stoppen, bis mein Service fertig ist. Das Problem ist, dass der Benutzer bis dahin nur einen leeren Bildschirm sieht. Ich habe Progressdialogs und normale Dialoge ausprobiert, während onResume pausiert ist. Aber alle werden nur angezeigt, wenn onResume zurückkehrt und das den Zweck vereitelt. Mit anderen Worten, macht Fortschritte Dialog nicht "Show" unmittelbar nach "show()" genannt wird :(

Antwort

1

Lokale Sendungen sind gut.

Lassen Sie Ihre Aktivitäten den Dienst fragen, wenn dieser besetzt ist oder nicht, und zeigen Sie dem Benutzer eine entsprechende Meldung an, bevor Sie die Aktivität beenden.

Sobald der Dienst fertig ist, senden Sie eine Absicht, dass es fertig ist.

+0

Ja, ich habe beschlossen, den Bildschirm nur zu verlassen, wenn der Benutzer die App startet, wenn der Dienst beschäftigt ist! Leider scheint eine "Toast" -Nachricht nicht zu funktionieren, wenn ich finish() aufgerufen habe: | –

2

ich hätte ein 'Ich bin beschäftigt Verarbeitung' Flag in der db.

Und die App sollte beim Start überprüfen, und dann die App auf eine nette Weise sperren, und dann sagen Sie alle x Sekunden, um den Status des Flags zu sehen.Es könnte dies während der normalen Verarbeitung tun, so dass jede Aktion dieses Flag lokal überprüft auf dem Server vor dem Start

Scheint wie eine einfache Art der Sperrung.So müssen Sie die Konkurrenz berücksichtigen (mehrere Benutzer Einstellung und unsettin g) möglicherweise unter Verwendung einer Semaphor-artigen Anordnung.

+0

Haben Semaphoren noch nicht studiert, aber ich habe Ihren Vorschlag versucht. Ich habe eine "thread.sleep" in einer While-Schleife in der "onResume" -Methode, aber der Bildschirm wurde leer und wachte nie auf :) –

+0

Sie müssen lesen, wie man einen schlafenden Thread erwecken –

+0

Hat es funktioniert :) . Das einzige Problem ist, dass, während die "onResume" -Funktion schläft, ich einen Toast oder eine Dialognachricht oder einen Fortschrittsdialog erhalten kann - diese werden nach onResume lebendig ... nun, setzt fort! –

0

Verwenden Sie AsyncTask in Ihrem Dienst, um schwere Datenbankarbeit zu tun.

und verwenden Sie Gemeinsam genutzte Einstellungen, um ein Flag zu speichern, um andere Aktivitäten zu melden, die gerade arbeiten. Wenn das Flag wahr ist, bedeutet "In Arbeit" und wenn "Flag" falsch ist bedeutet "Arbeit wurde erledigt".

etwas tun:

private class DatabaseWork extends AsyncTask<String, Integer, Long> { 


protected void onPreExecute() 
    { 
     //Set SharedPref flag = trueto notify other activities that work has been started. 
    } 
protected Long doInBackground(URL... urls) { 

     //Your database work 
    return false; 
} 

protected void onProgressUpdate(Integer... progress) { 
    //if you want to show progress to user 
} 

protected void onPostExecute(Long result) { 
    //after complete your work set SharedPref flag = false to notify other activities that work has been finished. 
} 

}

Jetzt können Sie SharedPref Flag-Wert auf jeder Aktivitäten onCreate oder onResume Ereignis überprüfen. Wenn Sie "True" gefunden haben, können Sie einen Fortschrittsdialog anzeigen, um dem Benutzer mitzuteilen, dass er warten soll.

+0

Ich führe die Aufgabe in einem Dienst aus, also prüfe ich in "onResume", ob sie läuft und wenn nicht, schalte sie für einige Sekunden in eine While-Schleife. Die einzige Sache ist, während der UI-Thread schläft, kann ich keinen Dialog oder eine Toast-Nachricht anzeigen. Diese scheinen sich zu zeigen, NACHDEM das onResume abgeschlossen hat, was den Punkt verfehlt! –

+0

@Bhagwad - Schlafen Sie nicht in 'onResume'. Entwerfen Sie stattdessen Ihre Lifecycle-Methoden ('onCreate',' onResume', 'onPause' usw.) in einem von zwei Zuständen, je nachdem, ob die Arbeit erledigt ist. –

+0

Die Sache ist, wenn meine Datenbank gesperrt ist, löst super.onResume einen Fehler aus. Da ich das auf jeden Fall anrufen muss, bin ich geschockt, es sei denn, ich kann die Ausführung verzögern, bis meine Datenbank frei ist. –

0

Der beste Weg, den ich gefunden habe, war eine "Ladeaktivität" zu erstellen, die immer zuerst geladen wird und den Benutzer auf den Hauptbildschirm schaltet, wenn es sicher war.

Verwandte Themen