Ich habe eine Schaltfläche in meiner App, die eine benutzerdefinierte Serviceklasse startet, wenn Sie darauf klicken. Wenn ich dann erneut klicke, stoppe ich den Dienst und zeige einen Fortschrittsdialog an.Android-Event-Bus: Ereignisse feuern, ohne auf einen Beitrag zu warten
Die onClick
jener Tasten sieht wie folgt aus:
public void onClick(View v) {
if (!recordingStarted){
try{
recordingStarted = true;
mainActivity.startService(new Intent(mainActivity, SensorService.class));
} catch (SQLException e){
mainActivity.logger.e(getActivity(),TAG, "SQL error insertSubject()", e);
}
} else {
dialog = new ProgressDialog(mainActivity);
dialog.setMessage("Stopping...");
dialog.setTitle("Saving data");
dialog.setProgressNumberFormat(null);
dialog.setCancelable(false);
dialog.setMax(100);
dialog.show();
mainActivity.stopService(new Intent(mainActivity, SensorService.class));
startButton.setEnabled(false);
}
}
Im onDestroy
Methode meines Dienstes, Ich überprüfe ein paar Dinge, und wenn die Kontrollen passieren, ich Eventbus verwenden, um eine Nachricht zurück zu schicken so an das Fragment, dass kann er den Fortschritt Dialogfeld schließen:
public void onDestroy() {
if (some condition is true){
//Send message to dismiss progress dialog
EventBus.getDefault().post(new DismissDialogEvent("dismiss"));
//Close databases and stop other things
unregisterListener();
dbHelper.close();
}
}
Meine DismissDialogEvent
Klasse ist hier:
Und in meinem Fragmente Ich tue dies:
@Override
public void onResume() {
super.onResume();
EventBus.getDefault().register(this);
}
@Override
public void onPause() {
EventBus.getDefault().unregister(this);
super.onPause();
}
@Subscribe
public void onEvent(DismissDialogEvent event){
if (event.message.equals("dismiss")){
dialog.dismiss();
}
}
Also, was geschehen soll, ist, wenn die Taste zum zweiten Mal angeklickt wird, wird ein Fortschrittsdialog wird angezeigt, wird der Dienst einige Dinge überprüfen und Dann sende eine Nachricht zurück an das Fragment. Das Fragment wird die Nachricht erhalten und dann das Fortschrittsdialogfeld
Das Problem ist, dass der Fortschrittsdialog sofort (sobald es erstellt wird) sofort beendet wird, so dass es überhaupt nicht angezeigt wird. Es ist fast so, als ob es nicht auf das Ablehnungs-Ereignis wartet, bevor es fortfährt, den Dialog zu schließen. Ich kann bestätigen, dass der Dialog durch das Auskommentieren der dialog.dismiss()
Linie zeigt
Wo gehe ich falsch mit meinem Code um dies zu verursachen?
Was ist der Rest der Service gerade? Haben Sie überprüft, ob die onDestroy-Methode zum erwarteten Zeitpunkt aufgerufen wird? –
Der Service fragt nur Sensoren ab, speichert sie alle 10ms mit einem Executor-Service in der Datenbank ab, erwirbt eine Wake-Sperre, so dass der Sensor immer gelesen werden kann, unabhängig vom Status des Bildschirms usw. Und ja, 'onDestroy' wird korrekt aufgerufen - das kann ich sehen Loggen Sie einfach etwas auf Logcat – Simon