2014-10-13 15 views
5

È davvero necessario utilizzare AndroidObservable.bindActivity(...) in casi come l'attività seguente? Poiché è comunque necessario annullare l'iscrizione manualmente in onDestroy.RxAndroid: quando utilizzare bindActivity e perché?

Secondo this blog inviati, bindActivity è necessaria perché:

non si tenta accidentalmente di modificare lo stato dopo che è valida per farlo

che -la modo ho letto significherebbe che potrebbero esserci problemi quando si fanno determinate cose con l'attività dopo che è stato chiamato finish() e quindi l'annullamento dell'iscrizione in onDestroy sarebbe troppo tardi.

Qualcuno può darmi un esempio di quando annullare l'iscrizione fino a tardi su onDestroy sarebbe effettivamente un problema?


Se si guarda alla the source per AndroidObservable.java la funzione predicato utilizzato per bindActivity è:

private static final Func1<Activity, Boolean> ACTIVITY_VALIDATOR = new Func1<Activity, Boolean>() { 
@Override public Boolean call(Activity activity) { 
     return !activity.isFinishing(); 
    } 
}; 

Non sarebbe meglio controllare anche per le modifiche di configurazione, come:

private static final Func1<Activity, Boolean> ACTIVITY_VALIDATOR = new Func1<Activity, Boolean>() { 
@Override public Boolean call(Activity activity) { 
     return !activity.isFinishing() && !activity.isChangingConfigurations(); 
    } 
}; 

???


SomeActivity.java

public class SomeActivity extends Activity implements Observer<String> { 
    private Subscription subscription; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     subscription = getObservable().observeOn(AndroidSchedulers.mainThread()).subscribe(this); 

     // or use bindActivity here???? 
     // subscription = AndroidObservable.bindActivity(this, getObservable()).subscribe(this); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     subscription.unsubscribe(); 
    } 

    @Override 
    public void onNext(String s) { 
     // do something with the activity state... 
    } 

    @Override public void onCompleted() {} 
    @Override public void onError(Throwable throwable) {} 
} 

risposta

4

Non si può fare transazioni frammento dopo onSaveInstanceState è stato chiamato, quindi se il vostro sottoscrivere apre una DialogFragment poi farlo prima, ma dopo onDestroyonSaveInstanceState potrebbe andare in crash l'applicazione. È probabile che ciò accada se l'attività si sta chiudendo e una richiesta di rete termina che desidera visualizzare un errore. Tutto ciò che richiede lo stato di salvataggio e quindi non può essere chiamato dopo onSaveInstanceState sarebbe un problema.

+0

Risposta chiara! Grazie. –

+0

Forse non sei più in giro, ma c'è qualche ragione per usare DialogFragments invece di semplici Dialogs? Mi sono opposto a questo errore molte volte e a questo punto mi sono arreso e sono tornato a quelli deprecati. –

+0

@ MLProgrammer-CiM 'DialogFragment' ha un ciclo di vita di Fragment invece di' Dialog' che è legato all'attività. Possono facilmente sopravvivere alla rotazione, a differenza del semplice 'Dialog'. – GDanger

Problemi correlati