1. 程式人生 > 其它 >如何完美隱藏Disposable的儲存和銷燬過程(一)

如何完美隱藏Disposable的儲存和銷燬過程(一)

技術標籤:kotlin函數語言程式設計

如何完美隱藏Disposable的儲存和銷燬過程(一)


–致敬我目前最喜歡的語言Kt

又到了寫我最最喜歡的RxJava的時刻了,寫點函式式的操作,很多時候都能讓我莫名其妙地high的不行!

今天來講講,在kt環境下,我到底是如何完美隱藏我的Disposable的建立和銷燬過程的。

相信大家一定在開發的過程中遇到過這樣的提示或者警告吧。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-SQr7OyPc-1613055073086)(/home/ciruy/.config/Typora/typora-user-images/image-20210211222352056.png)]

這個警告的意思就是,RxJava可能造成記憶體洩漏,你應該對Flowable的管道新增適當的處理,在該銷燬的時機就給他銷燬了。如果你心大一點,就直接加個@SuppressLint("CheckResult")

,如果你心細一點,就在activity建立的時候建立一個CompositeDisposable來統一管理,然後在onDestroy時,呼叫其dispose()來統一對其管理的Disposable進行回收。

我,是一個極簡主義者,我非常討厭過多的大括號的巢狀,而且將Disposable新增到CompositeDisposable的操作真的非常無聊,之前一直希望通過函式式的方式來優雅地解決這個問題,但是在Java語言中我發現,這樣做真的適得其反,反而讓程式碼更加複雜,可讀性更差。

但是當我嘗試通過Kt來實現對應的操作,世界豁然開朗。

先看成品,這是我通過函式式的方式實現的斷點下載功能。這是我從事Android開發以來,寫出來最令我滿意的程式碼了。

main_btn_down1.download(Constant.THUNDER_DOWNLOAD_FULL_URL) {
    main_progress1.max = it.total.toInt()
    main_progress1.progress = it.progress.toInt()
}
main_btn_cancel1.cancelDownload(Constant.THUNDER_DOWNLOAD_FULL_URL)

我所追求的完美的Activity就是讓其完全致力於業務,與繁瑣的具體完全脫鉤,即Activity你只需要負責檢視的繪製以及重新整理,其餘的邏輯不用你管。你看這裡我為按鈕指定了點選下載的邏輯,併為其設定需要下載的url路徑,然後我就只需要接受請求結果並且更新進度條檢視就行了。同理,取消按鈕也是一樣。

我常常對自己說,很多事情真的沒有那麼複雜,往往只需要解決三個哲學性問題就行了(社群的保安一定也常常在思考這些哲學性問題),大象裝冰箱問題同理:

  1. 你是誰
  2. 你要去哪
  3. 你要幹什麼

從純業務的角度來看不也就是這點事情嗎?我作為View層,我為什麼需要關心Disposable怎麼處理?

那實現程式碼就應該非常簡單,就拿下載結果來說

  1. 我是某個按鈕:main_btn_down1
  2. 我想獲取到這個地址的資料:download(Constant.THUNDER_DOWNLOAD_FULL_URL)
  3. 我想對返回資料進行分析:{ main_progress1.max = it.total.toInt() main_progress1.progress = it.progress.toInt() }

對不對?當我意識到這一點的時候,我真的感覺自己以前寫的到底是什麼?

那麼這個到底是怎麼實現的呢?且聽下回分解。