android - IllegalArgumentException when using Otto with a retained Fragment -
i using otto 1.3.3 , when resume application illegalargumentexception following stacktrace:
caused by: java.lang.illegalargumentexception: producer method type class  com.couchsurfing.mobile.ui.setup         .sessionproviderfragment$sessionconnectionstatechangeevent found on          type class com.couchsurfing.mobile.ui.setup.sessionproviderfragment,          registered type class          com.couchsurfing.mobile.ui.setup.sessionproviderfragment.     @ com.squareup.otto.bus.register(bus.java:194)     @ com.couchsurfing.mobile.ui.baseretainedfragment        .oncreate(baseretainedfragment.java:20) the sessionproviderfragment has instance retained, please find below extended class:
public abstract class baseretainedfragment extends sherlockfragment {      @inject     bus bus;      @override     public void oncreate(final bundle state) {         super.oncreate(state);         ((couchsurfingapplication) getactivity().getapplication()).inject(this);         setretaininstance(true);         bus.register(this);     }      @override     public void ondestroy() {         super.ondestroy();         bus.unregister(this);         bus = null;     } } i tried both using bus.register(this) in onattach() or oncreate(), didn't change issue.
the proper place register on bus in onresume() , proper place unregister in onpause() so:
public abstract class baseretainedfragment extends robosherlockfragment {     @inject private bus bus;      @override     public void oncreate(final bundle state) {         super.oncreate(state);         setretaininstance(true);     }      @override     public void onresume() {         super.onresume();         bus.register(this);     }      @override     public void onpause() {         super.ondestroy();         bus.unregister(this);     } } note ondestroy() not guaranteed called. 
you might comment on , say, hey chris, if register in onresume() , and events fired before hit method won't receive events! right, means aren't using producers should be.
also note, if use roboguice-sherlock don't have inject yourself. don't need null bus when fragment goes out of scope garbage collector clean you.
Comments
Post a Comment