网络请求随生命周期自动终止-Lifecycle实践

Lifecycle的目的是用来监听Activity和Fragmet的生命周期的变化,在生命周期的拥有者和生命周期的观察者之间建立一种联系,当生命周期拥有者生命周期改变的时候,观察者会收到对应的通知,所以可以可方便的判断生命周期的状态。当然也可以不适用Lifecycle,而是直接在activity或Fragment的的生命周期的回调里面处理各种事情,使用Lifecycle的目的就是解耦。

Lifecycle中需要使用的类:
LifecycleObserver:Lifecycle观察者
LifecycleOwner: 被观察者,就是生命周期的拥有者Activity或Fragment

LifecycleOwner 默认的activity和Fragment已经实现,所以我们只需要实现LifecycleObserver,并让其建立联系即可。

比如:

class LifecycleSourceEvent : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun doResume(){

        Log.i("LifecycleSourceEvent", "doResume: ")
    }
    
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun doPause(){
        Log.i("LifecycleSourceEvent", "doResume: ")
    }
}

在base activity中让它和activity建立关系即可:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_rxjava)
    lifecycle.addObserver(LifecycleSourceEvent())
}

activity的生命周期就可以被观察了,并产生响应的回调
可以回调的事件都已经包含了,只要添加相应的注解即可:

public enum Event {
    /**
     * Constant for onCreate event of the {@link LifecycleOwner}.
     */
    ON_CREATE,
    /**
     * Constant for onStart event of the {@link LifecycleOwner}.
     */
    ON_START,
    /**
     * Constant for onResume event of the {@link LifecycleOwner}.
     */
    ON_RESUME,
    /**
     * Constant for onPause event of the {@link LifecycleOwner}.
     */
    ON_PAUSE,
    /**
     * Constant for onStop event of the {@link LifecycleOwner}.
     */
    ON_STOP,
    /**
     * Constant for onDestroy event of the {@link LifecycleOwner}.
     */
    ON_DESTROY,
    /**
     * An {@link Event Event} constant that can be used to match all events.
     */
    ON_ANY
}

在我们平常做项目中,我们可能会遇到这种需求,请求网络数据,如果请求失败,可能会多试几下,但是当你直接按home键直接退出,或者黑屏了,理论上就不应该在重试了,这个时候有么有什么优雅的方式,停止网络请求呢,这个生命周期的回调加上rxjava或许可以做的很优雅。

Rxjava中的有一个PublishSubject
PublishSubject的Observer只会接收到PublishSubject被订阅之后发送的数据

所以思路是每当生命周期进行回调的时候,就可以用PublishSubject发送数据,订阅PublishSubject的观察者就可以拿到生命周期的回调,然后利用Rxjava的操作符takeUtil进行终止网络请求的重试即可:
代码如下:

class LifecycleSourceEvent : LifecycleObserver {

    val lifeSourceEventObject = PublishSubject.create<Lifecycle.Event>()

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun doResume(){
        lifeSourceEventObject.onNext(Lifecycle.Event.ON_RESUME)
    }
    
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun doPause(){
        lifeSourceEventObject.onNext(Lifecycle.Event.ON_PAUSE)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun doStop(){
        lifeSourceEventObject.onNext(Lifecycle.Event.ON_STOP)
    }

    fun getLifecycleObservable(): Observable<Lifecycle.Event> {
        return lifeSourceEventObject.hide()
    }
}

关于模拟网络请求的代码如下:模拟发送异常,隔一秒重新发松请求

fun  testTakeUtil(lifecycleObservable: Observable<Lifecycle.Event>, vararg events: Lifecycle.Event){

    var count: Int = 0
    Observable.create(ObservableOnSubscribe<String> { emitter ->
        count ++
        Log.i(TAG, "onCreate:  创造数字$count")
        emitter?.onNext("$count")
    }).flatMap {
        Log.i(TAG, "flatMap: $it")
        if(it.toInt() < 100){
            Observable.error(Exception())
        }else{
            Observable.just(it)
        }
    }.retryWhen {
        Log.i(TAG, "retryWhen: $it")
        it.flatMap {
                throwable ->
            if(throwable is Exception){
                Observable.timer(2, TimeUnit.SECONDS)
            }else{
                Observable.error(throwable)
            }
        }
    }.takeUntil(lifecycleObservable.filter {
        for (event in events){
            if(it == event){
                Log.i(TAG, "takeUntil:请求终止")
                return@filter true
                }
            }
        return@filter false
        })
        .subscribe({
            Log.i(TAG, "subscribe: $it")
        },
            {
                Log.i(TAG, "subscribe: $it")
            })
}

activity中调用如下:


class RxjavaActivity : AppCompatActivity() {
    private var lifecycleSource = LifecycleSourceEvent()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_rxjava)
        lifecycle.addObserver(lifecycleSource)
    }

    val test = RxjavaTest()
    fun onClickTakeUtil(view: View){
        test.testTakeUtil(lifecycleSource.getLifecycleObservable(), Lifecycle.Event.ON_PAUSE)
    }
}

黑屏之后,打印结果如下:

2021-07-01 11:40:01.780 4336-4551/com.example.helloworld I/RxjavaTest: onCreate:  创造数字3
2021-07-01 11:40:01.780 4336-4551/com.example.helloworld I/RxjavaTest: flatMap: 3
2021-07-01 11:40:03.782 4336-4618/com.example.helloworld I/RxjavaTest: onCreate:  创造数字4
2021-07-01 11:40:03.782 4336-4618/com.example.helloworld I/RxjavaTest: flatMap: 4
2021-07-01 11:40:04.008 4
336-4336/com.example.helloworld I/RxjavaTest: takeUntil:请求终止

RetryWhen用于首先是重试机制,takeUtil操作符当满足条件的时候,事件就不会被发送了,事件终止。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
elasticjob-lite-lifecycle 3.1.0 是一个轻量级分布式任务调度器的生命周期管理工具。它是 ElasticJob 的一个组件,可以帮助开发者更方便地管理任务的生命周期。 elasticjob-lite-lifecycle 3.1.0 提供了以下主要功能: 1. 任务的创建与注册:可以通过该工具创建任务并将其注册到 ElasticJob 中。开发者可以指定任务的名称、描述、执行模式等信息。 2. 任务的修改与更新:可以修改已注册的任务的属性,如任务的运行时间表达式、任务执行参数等。任何对任务的修改和更新都可以通过该工具进行。 3. 任务的启动与暂停:可以通过该工具对任务进行启动和暂停操作。当任务处于暂停状态时,任务调度器不会触发任务的执行。当任务处于启动状态时,任务调度器会按照设置的时间表达式来触发任务的执行。 4. 任务的删除与注销:可以通过该工具删除已创建的任务,并将其从 ElasticJob 中注销。注销后的任务将不再参与任务调度。 5. 任务的状态查询:可以查询任务的当前状态,包括是否处于启动状态、最近一次执行时间、下一次执行时间等。这些状态信息可以帮助开发者更好地监控任务的执行情况。 6. 任务的日志管理:可以通过该工具查看任务的执行日志,包括任务的执行结果、执行时间、日志级别等。这些日志信息可以帮助开发者分析任务的执行情况,排查问题。 elasticjob-lite-lifecycle 3.1.0 简化了任务的生命周期管理流程,提供了丰富的功能,使开发者可以更加方便地管理和监控任务。同时,它与 ElasticJob 的其他组件紧密结合,为分布式任务调度提供了全面的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟红尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值