1. 程式人生 > >Rxjava2的lint提示:The result of subscribe is not used的分析與解決

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

隨著Android Studio的進一步升級,其Lint能力愈加強大,比如現在專案中生成一個Obervable之後,若沒subscribe給Observer,而僅僅是給了幾個Consumer,則會被醒目的提示程式碼有問題,如下圖:

在這裡插入圖片描述

程式碼提示主要是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掉。方式如下:
在這裡插入圖片描述

最後呢,我們發現這種寫法有點麻煩啊,對不起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掉啊。

結束,希望對讀者有幫助。