Rxlifecycle生命周期的管理 配置使用

来源:互联网 发布:游戏源码有什么用 编辑:程序博客网 时间:2024/06/03 13:38

Rxlifecycle生命周期的管理 配置使用

在使用响应式Rx..开发Android时 为了考虑到组件的生命周期防止内存泄露 Rxlifecycle 就提供了很好的解决方案.

开源项目地址 :https://github.com/trello/RxLifecycle

使用时引入库:

    compile 'com.trello.rxlifecycle2:rxlifecycle:2.2.1'    // If you want pre-written Activities and Fragments you can subclass as providers    compile 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.1'

官网给的 rxlifecycle-sample demo 片段代码

public class MainActivity extends RxAppCompatActivity {    private static final String TAG = "RxLifecycleAndroid";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);// Specifically bind this until onPause()-----------------------------------        Observable.interval(1, TimeUnit.SECONDS)            .doOnDispose(new Action() {                @Override                public void run() throws Exception {                    Log.i(TAG, "Unsubscribing subscription from onCreate()");                }            })            .compose(this.<Long>bindUntilEvent(ActivityEvent.PAUSE))            .subscribe(new Consumer<Long>() {                @Override                public void accept(Long num) throws Exception {                    Log.i(TAG, "Started in onCreate(), running until onPause(): " + num);                }            });    } //----------------以上设置是在生命周期oncreate手动设置 ActivityEvent.PAUSE解绑----------------------------------------------------------------    @Override    protected void onStart() {        super.onStart();        Observable.interval(1, TimeUnit.SECONDS)            .doOnDispose(new Action() {                @Override                public void run() throws Exception {                    Log.i(TAG, "Unsubscribing subscription from onStart()");                }            })            .compose(this.<Long>bindToLifecycle())            .subscribe(new Consumer<Long>() {                @Override                public void accept(Long num) throws Exception {                    Log.i(TAG, "Started in onStart(), running until in onStop(): " + num);                }            });    }//------------------------this.<Long>bindToLifecycle()以上是自动解绑在onstop里------------    @Override    protected void onResume() {        super.onResume();        Observable.interval(1, TimeUnit.SECONDS)            .doOnDispose(new Action() {                @Override                public void run() throws Exception {                    Log.i(TAG, "Unsubscribing subscription from onResume()");                }            })            .compose(this.<Long>bindUntilEvent(ActivityEvent.DESTROY))            .subscribe(new Consumer<Long>() {                @Override                public void accept(Long num) throws Exception {                    Log.i(TAG, "Started in onResume(), running until in onDestroy(): " + num);                }            });    }//------------------------ActivityEvent.DESTROY 以上是手动解绑在DESTROY里------------    @Override    protected void onPause() {        super.onPause();        Log.d(TAG, "onPause()");    }    @Override    protected void onStop() {        super.onStop();        Log.d(TAG, "onStop()");    }    @Override    protected void onDestroy() {        super.onDestroy();        Log.d(TAG, "onDestroy()");    }}   

为什么compose(this.bindToLifecycle()) 在onstart执行操作 在onstop 里自动解绑 而不再ondestory 在官方给的demo源码里rxlifecycle-android包里的RxLifecycleAndroid.java

  //  计算下一个生命周期事件中取消订阅的对应事件。  Activity------------------  // Figures out which corresponding next lifecycle event in which to unsubscribe, for Activities    private static final Function<ActivityEvent, ActivityEvent> ACTIVITY_LIFECYCLE =        new Function<ActivityEvent, ActivityEvent>() {            @Override            public ActivityEvent apply(ActivityEvent lastEvent) throws Exception {                switch (lastEvent) {                    case CREATE:                        return ActivityEvent.DESTROY;                    case START:                        return ActivityEvent.STOP;                    case RESUME:                        return ActivityEvent.PAUSE;                    case PAUSE:                        return ActivityEvent.STOP;                    case STOP:                        return ActivityEvent.DESTROY;                    case DESTROY:                        throw new OutsideLifecycleException("Cannot bind to Activity lifecycle when outside of it.");                    default:                        throw new UnsupportedOperationException("Binding to " + lastEvent + " not yet implemented");                }            }        };//  计算下一个生命周期事件中取消订阅的对应事件。  Fragment--------------    // Figures out which corresponding next lifecycle event in which to unsubscribe, for Fragments    private static final Function<FragmentEvent, FragmentEvent> FRAGMENT_LIFECYCLE =        new Function<FragmentEvent, FragmentEvent>() {            @Override            public FragmentEvent apply(FragmentEvent lastEvent) throws Exception {                switch (lastEvent) {                    case ATTACH:                        return FragmentEvent.DETACH;                    case CREATE:                        return FragmentEvent.DESTROY;                    case CREATE_VIEW:                        return FragmentEvent.DESTROY_VIEW;                    case START:                        return FragmentEvent.STOP;                    case RESUME:                        return FragmentEvent.PAUSE;                    case PAUSE:                        return FragmentEvent.STOP;                    case STOP:                        return FragmentEvent.DESTROY_VIEW;                    case DESTROY_VIEW:                        return FragmentEvent.DESTROY;                    case DESTROY:                        return FragmentEvent.DETACH;                    case DETACH:                        throw new OutsideLifecycleException("Cannot bind to Fragment lifecycle when outside of it.");                    default:                        throw new UnsupportedOperationException("Binding to " + lastEvent + " not yet implemented");                }            }        };

以上的意思是在oncreate()中订阅 ondestory()停止发射…..以此类推………………

配合retrofit 用法

 Retrofit retrofit = new Retrofit.Builder().baseUrl(url).addConverterFactory(ScalarsConverterFactory.create()).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build(); biz = retrofit.create(IBiz.class);biz.courselist("小猫").compose(this.<CourseList>bindToLifecycle()).  subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<CourseList>() {            @Override            public void onSubscribe(@NonNull Disposable d) {            }            @Override            public void onNext(@NonNull CourseList courseList) {            }            @Override            public void onError(@NonNull Throwable e) {            }            @Override            public void onComplete() {            }        });
原创粉丝点击