Sie können die Ereignis Busereignissen zu onStart()
und onStop()
, aber Sie sollten wissen, bewegen, dass bestimmte Methoden nicht nach onSaveInstanceState()
aufgerufen werden kann (zum Beispiel ein DialogFragment entlassen Sie stürzt aus).
Also während dieses Beispiel für Otto war, wechselte ich es zu EventBus, und ich persönlich habe einen Wrapper, der Ereignisse speichert, während die Anwendung pausiert ist.
public enum SingletonBus {
INSTANCE;
private static String TAG = SingletonBus.class.getSimpleName();
private final Vector<Object> eventQueueBuffer = new Vector<>();
private boolean paused;
public <T> void post(final T event) {
if (paused) {
eventQueueBuffer.add(event);
} else {
EventBus.getDefault().post(event);
}
}
public <T> void register(T subscriber) {
EventBus.getDefault().register(subscriber);
}
public <T> void unregister(T subscriber) {
EventBus.getDefault().unregister(subscriber);
}
public boolean isPaused() {
return paused;
}
public void setPaused(boolean paused) {
this.paused = paused;
if (!paused) {
Iterator<Object> eventIterator = eventQueueBuffer.iterator();
while (eventIterator.hasNext()) {
Object event = eventIterator.next();
post(event);
eventIterator.remove();
}
}
}
}
Dann wird in einem BaseActivity der Art,
public class BaseActivity extends AppCompatActivity {
@Override
public void onPostResume() {
super.onPostResume();
SingletonBus.INSTANCE.setPaused(false);
}
@Override
public void onPause() {
SingletonBus.INSTANCE.setPaused(true);
super.onPause();
}
}
Schön! Sprechen Sie über IllegalStateException für die Übertragung von Fragmenttransaktionen innerhalb von Lebenszyklusmethoden? – Jumpa
Ja. Das ist eine totale Schlampe, ich war überrascht, als ich hineingerannt bin. So erlaube ich die Übertragung von Ereignissen nur, wenn die App nicht pausiert ist. – EpicPandaForce
Das liegt daran, dass das System Ihren Prozess nach 'onSaveInstanceState()' brutal beenden kann, so dass Sie die gerade begangene Transaktion verlieren könnten. Btw netter Code, aber warum 'Vector'? –