0

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?

+0

Was ist der Rest der Service gerade? Haben Sie überprüft, ob die onDestroy-Methode zum erwarteten Zeitpunkt aufgerufen wird? –

+0

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

Antwort

0

Wenn Sie Service zu diesem Zeitpunkt erste Eventbus registrieren und als Dienst starten und nach dem Dialogfeld schließen bitte deregistrieren Ihre EventBus Ihnen helfen, starten

+0

Also, wenn ich Eventbus in meinem 'onClick' unmittelbar vor dem Start des Dienstes registrieren, und dann sofort nach dem Stoppen des Dienstes die Registrierung aufheben, bekomme ich eine Nachricht mit dem Hinweis' Keine Teilnehmer registriert für Ereignisklasse com.example.app .DismissDialogEvent' – Simon

+0

@Simon Registrierung nach dem Dialog abweisen –

+0

Ich habe das gleiche Problem, wenn ich das tue - der Dialog zeigt nicht und sofort – Simon

Verwandte Themen