Rxjava2的lint提示:The result of subscribe is not used的分析与解决

随着Android Studio的进一步升级,其Lint能力愈加强大,比如现在项目中生成一个Obervable之后,若没subscribe给Observer,而仅仅是给了几个Consumer,则会被醒目的提示代码有问题,如下图:

Rxjava2的lint提示:The result of subscribe is not used的分析与解决_第1张图片

代码提示主要是The result of subscribe is not used,即订阅的结果未使用。这为什么会提示,又会造成什么后果呢?

原因为AS并不知道这个没有使用(分解)的订阅会有什么潜在的风险,例如:若在事件流中有耗时操作,同时事件流中某个事件又持有了Activity的引用,那么当Activity被关闭时,其引用仍会被未结束的事件所持有,会造成内存泄露;另外当Activity生命周期走到destroy后(注意:并不是Activity对象被回收),之后Activity中的view却要根据事件结果设置属性,则可能导致空指针异常(view的引用已被释放)。所以AS还是比较负责任的,提前把这么些大问题暴露出来,让我们好好写代码。

上述问题怎么解决呢?毕竟屏幕上显示着那么一大块黄色代码并不好看吧。解决方式很简单,就是在subscribe时将这个Disposable对象赋值给一个变量可以去掉lint提示了,因为这时候IDE会认为你将会对这个变量有其它操作,从这点上看,这IDE还是不够智能。因为仅仅这样是不够的,仍然存在上述风险,因为赋值后不处理嘛。。。囧
其实这类问题在rxjava的使用中很常见,毕竟大家主要是拿rxjava来配合网络来使用的,很容易碰到网络请求造成的 内存泄露隐患,解决方式也正如网上常见的解决方式,就是使用CompositeDisposable类来管理每一个注册事件流,等不需要的时候,将disposable对象dispose掉。方式如下:
Rxjava2的lint提示:The result of subscribe is not used的分析与解决_第2张图片

最后呢,我们发现这种写法有点麻烦啊,对不起kotlin的灵活性,所以我们给Disposable加个扩展函数:

fun Disposable.addTo(c:CompositeDisposable){
    c.add(this)
}

然后之前的代码就可以这样写了

Observable.just("one")
                .subscribe(
                        {
                            Log.d("TAG",it)
                        },
                        {
                            Log.d("TAG",it.message)
                        }
                ).addTo(co)

最后,记得在合适的位置将CompositeDisposable对象clear或者dispose掉啊。

结束,希望对读者有帮助。

你可能感兴趣的:(Kotlin,rxjava)