Giter Club home page Giter Club logo

rxlife's Introduction

RxHttp&RxLife 交流群:378530627      个人微信:ljx-studio

RxLife

RxLife,相较于trello/RxLifecycleuber/AutoDispose,具有如下优势:

  • 直接支持在主线程回调
  • 支持在子线程订阅观察者
  • 简单易用,学习成本低
  • 性能更优,在实现上更加简单

友情提示: RxLife与RxHttp搭配使用,味道更佳

RxLife详细介绍:https://juejin.im/post/5cf3e1235188251c064815f1

Gradle引用

jitpack添加到项目的build.gradle文件中,如下:

allprojects {
    repositories {
        maven { url "https://jitpack.io" }
    }
}

注:RxLife 2.1.0 版本起,已全面从JCenter迁移至jitpack

新版本仅支持AndroidX项目

dependencies {
   //rxjava2
   implementation 'com.github.liujingxing.rxlife:rxlife-rxjava2:2.2.2'
       
   //rxjava3
   implementation 'com.github.liujingxing.rxlife:rxlife-rxjava3:2.2.2'
}

注意:RxJava2 使用Rxlife.asXxx方法;RxJava3使用Rxlife.toXxx方法

非AndroidX项目

非AndroidX项目,请使用旧版本RxLife

implementation 'com.rxjava.rxlife:rxlife:2.0.0'

由于Google在19年就停止了非AndroidX库的更新,故rxlife旧版本不再维护,请尽快将项目迁移至AndroidX

#Usage

1、FragmentActivity/Fragment

FragmentActivity/Fragment销毁时,自动关闭RxJava管道

Observable.timer(5, TimeUnit.SECONDS)
    .as(RxLife.as(this))     //此时的this FragmentActivity/Fragment对象
    .subscribe(aLong -> {
        Log.e("LJX", "accept =" + aLong);
    });

2、View

View被移除时,自动关闭RxJava管道

Observable.timer(5, TimeUnit.SECONDS)
    .as(RxLife.as(this))  //此时的this 为View对象
    .subscribe(aLong -> {
        Log.e("LJX", "accept =" + aLong);
    });

3、ViewModel

Activity/Fragment销毁时,自动关闭RxJava管道,ViewModel需要继承ScopeViewModel类,如下

public class MyViewModel extends ScopeViewModel {

    public MyViewModel(@NonNull Application application) {
        super(application);
    }
   
    public void test(){
        Observable.interval(1, 1, TimeUnit.SECONDS)
            .as(RxLife.asOnMain(this))  //继承ScopeViewModel后,就可以直接传this
            .subscribe(aLong -> {
                Log.e("LJX", "MyViewModel aLong=" + aLong);
            });
    }
}

注意: 一定要在Activity/Fragment通过以下方式获取ViewModel对象,否则RxLife接收不到生命周期的回调

MyViewModel viewModel = ViewModelProviders.of(this).get(MyViewModel.class);

4、任意类

Activity/Fragment销毁时,自动关闭RxJava管道,任意类需要继承BaseScope类,如P层:

public class Presenter extends BaseScope {

    public Presenter(LifecycleOwner owner) {
        super(owner); //添加生命周期监听
    }
    
    public void test(){
        Observable.interval(1, 1, TimeUnit.SECONDS)
            .as(RxLife.as(this)) //继承BaseScope后,就可以直接传this
            .subscribe(aLong -> {
                Log.e("LJX", "accept aLong=" + aLong);
            });
    }
}

5、kotlin用户

由于as是kotlin中的一个关键字,所以在kotlin中,我们并不能直接使用as(RxLife.as(this)),可以如下编写

Observable.intervalRange(1, 100, 0, 200, TimeUnit.MILLISECONDS)
    .`as`(RxLife.`as`(this))
    .subscribe { aLong ->
        Log.e("LJX", "accept=" + aLong)
    }

当然,相信没多少人会喜欢这种写法,故,RxLife针对kotlin用户,新增更为便捷的写法,如下:

Observable.intervalRange(1, 100, 0, 200, TimeUnit.MILLISECONDS)
    .life(this)
    .subscribe { aLong ->
        Log.e("LJX", "accept=" + aLong)
    }

使用life 操作符替代as操作符即可,其它均一样

6、小彩蛋

asOnMain操作符

RxLife还提供了asOnMain操作符,它可以指定下游的观察者在主线程中回调,如下:

Observable.timer(5, TimeUnit.SECONDS)
    .as(RxLife.asOnMain(this))
    .subscribe(aLong -> {
        //在主线程回调
       Log.e("LJX", "accept =" + aLong);
    });

        //等价于
Observable.timer(5, TimeUnit.SECONDS)
    .observeOn(AndroidSchedulers.mainThread())
    .as(RxLife.as(this))
    .subscribe(aLong -> {
        //在主线程回调
        Log.e("LJX", "accept =" + aLong);
    });

kotlin 用户使用lifeOnMain替代asOnMain操作符,其它均一样

注意: RxLife类里面as操作符,皆适用于Flowable、ParallelFlowable、Observable、Single、Maybe、Completable这6个被观察者对象

混淆

RxLife作为开源库,可混淆,也可不混淆,如果不希望被混淆,请在proguard-rules.pro文件添加以下代码

-keep class com.rxjava.rxlife.**{*;}

更新日志

2.2.2

2022-04-01

  • Kotlin升级至v1.6.10

  • Lifecycle升级至v2.4.1

2.2.1

2021-09-05

  • 适配RxJava v3.1.1版本RxLife v2.2.1版本部分API不向下兼容,升级该版本的同时,同步升级RxJava 版本至v3.1.1 不向下兼容的API:Completable + RxLifeParallelFlowable + RxLife

2.2.0

2021-09-01

  • Kotlin 升级到1.5.30

  • rxLifeScope标记为过时,正式退出历史舞台

2.1.0

2021-05-11

  • 新增:RxLife类下新增dispose(Disposable)、isDisposed(Disposable)静态方法

  • 修改:由于JCenter停止维护,故全面迁移至jitpack,groupId由之前com.ljx.rxlife改为com.github.liujingxing.rxlife,版本升级时,请注意更改依赖

2.0.0

  • 新增RxLifeScope类,用于开启协程,并在FragmentActivity/ViewModel环境下可以自动关闭协程

  • rxlife-x 的lifecycle等组件升级到2.2.0版本

1.1.0

  • RxLife类增加as(View,boolean)、asOnMain(View,boolean)方法

  • 删除过时的lift、compose等方法

1.0.9

  • kotlin中,支持在ViewModel及任意类使用life、lifeOnMain操作符

1.0.8

  • 修复在Activity/Fragment中,子线程订阅事件时,偶现观察者没有回调问题

1.0.7

  • BaseScope、ScopeViewModel两个类加入RxLife 此版本中

1.0.6

  • 代码优化

1.0.5

  • 引入作用域的概念,支持在View中自动中断RxJava管道

  • 对Kotlin简单适配,在kotlin中可使用life操作符绑定生命周期

1.0.4

  • 新增as操作符,规定下游只能使用subscribe操作符

  • lift、compose 标记为过时,在未来的版本中将会删除,请使用as操作符替代

Licenses

Copyright 2019 liujingxing

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

rxlife's People

Contributors

liujingxing avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

rxlife's Issues

关于presenter需要继承BaseScope的疑问

demo中的presenter直接to(RxLife.to(owner)) 不可以么?就下面这样子:

public class Presenter{

    public Presenter(LifecycleOwner owner) {
        Observable.interval(1, 1, TimeUnit.SECONDS)
            .to(RxLife.to(owner)) //这里的this 为Scope接口对象
            .subscribe(aLong -> {
                Log.e("LJX", "accept aLong=" + aLong);
            });
    }
}

请问这样会出现什么问题么?

一个命名方面的小问题

当使用kotlin语言开发的时候 as 是关键词,不能作为方法名使用,需要as这样使用,不太方便,望改名。

在用, 经测试没问题,但是有一个小问题

在使用的过程中使用as方法转换后返回ObservableLife对象然后调用subscribe方法,这样的流程可以走得通,但是这样导致了扩展性的限制, 我在实际使用中想把这个方法抽取到网络请求的公共方法中,这样对代码的侵入性会很低,但是由于调用该方法之后只能 subscribe 导致将这个方法抽取比较复杂了, 所以我想问一下为什么不能返回 Observable 对象方便向下调用呢?

LifeObserver类的异常捕获问题

LifeObserver 类捕获异常的问题,正常逻辑,客户端一般是接口相关的错误,才会捕获异常,结果现在一些代码问题导致的异常也会被捕获。
比方说接口请求成功了,我在setData的代码里面,使用导致什么空指针,也会被这里catch。
目前项目线上的异常都被它捕获了,拦截了一些crash问题,这里希望开源作者能优化下,不要捕获全部的异常

 @Override
    public void onNext(T t) {
        if (isDisposed()) return;
        try {
            downstream.onNext(t);
        } catch (Throwable e) {
            Exceptions.throwIfFatal(e);
            get().dispose();
            onError(e);
        }
    }

引入最新的rxlife-rxjava2报错

rxlife-rxjava2_release.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.5.1, expected version is 1.1.16.会报这个错误。但是使用implementation 'com.rxjava.rxlife:rxlife-x:1.0.8'就没有问题,求大神指导

Rxjava3使用Retrofit,提示Cannot resolve method 'subscribe' in 'Object'

image

.takeUntil(new Predicate() {
@OverRide
public boolean test(Erweimalogin integer) throws Exception {
return (integer.getCode() == 1);
// 返回true时,就停止发送事件
}
})
                .subscribeOn(Schedulers.io())               // 切换到IO线程进行网络请求
                .observeOn(AndroidSchedulers.mainThread())  // 切换回到主线程 处理请求结果
                .to(RxLife.to(this))
                .subscribe(new Observer<Erweimalogin>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.d(TAG, "dingyue");
                    }

                    @Override
                    public void onNext(Erweimalogin result) {
                        // e.接收服务器返回的数据
                        Log.i(TAG, String.valueOf(result.getMsg()));
                    }

                    @Override
                    public void onError(Throwable e) {
                        // 获取轮询结束信息
                        Log.d(TAG, e.toString());
                    }

                    @Override
                    public void onComplete() {
                        Log.d(TAG, "完成");
                    }
                });

部分代码

求教

大佬请教一下,这个在Service里面如何跟生命周期绑定呢。

rxLifeScope.launch { } 线程选择

rxLifeScope.launch { } 可以像 GlobalScope.launch (Dispatchers.IO){ },可以选择在哪个线程中调用吗?
有时候一些操作必须要到IO线程才能操作

demo中的observableByVM点击事件崩溃了

fun observableByVM(view: View) {
    //注:不能使用new 关键字创建MyViewModel对象,否则MyViewModel感知不到生命周期
    val viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
}

这个崩溃了

onFinally中没有判断isActive

onFinally中没有判断isActive,那在onFinally中操作了界面,一旦fragment被销毁回收,就会报错说xxxx until the Fragment is attached to the FragmentManager

ViewModelProvider(this).get(MyViewModel::class.java)

//注:不能使用new 关键字创建MyViewModel对象,否则MyViewModel感知不到生命周期
val viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
大神请教,viewModel的创建,在kt下如上写法,在java下必须要new,上述说不能使用new,请问java下viewModel如何创建?

使用.to操作符后 ,crash

hi
使用.to操作符后 ,crash

2021-12-16 15:16:50.071 18042-18042/com.tpv.rain.rxjava3test E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.tpv.rain.rxjava3test, PID: 18042
java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Intrinsics;
at com.rxjava.rxlife.ObjectHelper.requireNonNull(ObjectHelper.kt)
at com.rxjava.rxlife.ObservableLife.subscribe(ObservableLife.java:64)
at com.tpv.rain.rxjava3test.SecondActivity.testLeak(SecondActivity.java:36)
at com.tpv.rain.rxjava3test.SecondActivity.onResume(SecondActivity.java:29)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1269)
at android.app.Activity.performResume(Activity.java:6766)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3377)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3440)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2713)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Caused by: java.lang.ClassNotFoundException: Didn't find class "kotlin.jvm.internal.Intrinsics" on path: DexPathList[[zip file "/data/app/com.tpv.rain.rxjava3test-2/base.apk"],nativeLibraryDirectories=[/data/app/com.tpv.rain.rxjava3test-2/lib/x86, /system/lib, /vendor/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at com.rxjava.rxlife.ObjectHelper.requireNonNull(ObjectHelper.kt) 
at com.rxjava.rxlife.ObservableLife.subscribe(ObservableLife.java:64) 
at com.tpv.rain.rxjava3test.SecondActivity.testLeak(SecondActivity.java:36) 
at com.tpv.rain.rxjava3test.SecondActivity.onResume(SecondActivity.java:29) 
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1269) 
at android.app.Activity.performResume(Activity.java:6766) 
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3377) 
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3440) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2713) 
at android.app.ActivityThread.-wrap12(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:6077) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 


配置:
//RxJava的依赖包
implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
//RxAndroid的依赖包
implementation 'io.reactivex.rxjava3:rxjava:3.0.0'

implementation 'com.github.liujingxing.rxlife:rxlife-rxjava3:2.2.1'

code(java):
@OverRide
protected void onResume() {
super.onResume();
testLeak();
}

private void testLeak(){
    Observable.timer(1, TimeUnit.SECONDS)
             .to(RxLife.to(this))
            .subscribe(new Observer<Long>() {
                @Override
                public void onSubscribe(@NonNull Disposable d) {

                }

                @Override
                public void onNext(@NonNull Long aLong) {
                    LogUtil.d(TAG, "[testLeak] onNext:"+aLong);
                }

                @Override
                public void onError(@NonNull Throwable e) {
                    LogUtil.d(TAG, "[testLeak] onError");
                }

                @Override
                public void onComplete() {
                    LogUtil.d(TAG, "[testLeak] onComplete");
                }
            });

}

偶发性报ClassCastException这个错误

2020-12-29 16:51:22.082 18675-18675/com.aofa.baseplatform E/ARouter::: InstantRun support error, com.android.tools.fd.runtime.Paths
2020-12-29 16:51:24.147 18675-1835/com.aofa.baseplatform E/cutils-trace: Error opening trace file: No such file or directory (2)
2020-12-29 16:51:59.199 18675-18675/com.aofa.baseplatform E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.aofa.baseplatform, PID: 18675
java.lang.ClassCastException: androidx.lifecycle.LifecycleCoroutineScopeImpl cannot be cast to com.rxlife.coroutine.RxLifeScope
at androidx.lifecycle.RxLifeKt.getRxLifeScope(RxLife.kt:30)
at androidx.lifecycle.RxLifeKt.getRxLifeScope(RxLife.kt:24)
at com.aofa.baseplatform.ui.volunteer.VolunteerRegActivity.submit(VolunteerRegActivity.kt:83)
at com.aofa.baseplatform.ui.volunteer.VolunteerRegActivity$init$$inlined$apply$lambda$1.onClick(VolunteerRegActivity.kt:46)
at com.aofa.baseplatform.base.BaseActionBarWidget.onClick(BaseActionBarWidget.kt:282)
at android.view.View.performClick(View.java:7455)
at android.view.View.performClickInternal(View.java:7432)
at android.view.View.access$3600(View.java:810)
at android.view.View$PerformClick.run(View.java:28313)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7661)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:594)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

com.rxjava.rxlife.OutsideScopeException: View is not attached

自定义view,经常性的报这个错误,有什么好的方式避免么?
com.rxjava.rxlife.OutsideScopeException: View is not attached!
at com.rxjava.rxlife.ViewScope.onScopeStart(ViewScope.java:45)
at com.rxjava.rxlife.AbstractLifecycle.addObserverOnMain(AbstractLifecycle.java:58)
at com.rxjava.rxlife.AbstractLifecycle.addObserver(AbstractLifecycle.java:34)
at com.rxjava.rxlife.LifeObserver.onSubscribe(LifeObserver.java:29)
at io.reactivex.internal.operators.observable.ObservableDetach$DetachObserver.onSubscribe(ObservableDetach.java:66)

在View中是否无法使用

Observable
.interval(delay, peroid, TimeUnit.MILLISECONDS)
.as(RxLife.as(this))
.subscribe(aLong -> {
........
});
会不执行

兼容有问题

看了作者添加了androidX支持,但是原始android包又报错

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.