比如有這麼一個需求:網絡上下載一張圖片,然後顯示在界面上。常規的做法可能就是開一個子線程負責網絡圖片的下載,得到圖片後,通過Handler發送到UI線程進行界面的更新。這樣寫,當然也沒有問題,但是,這樣會顯得代碼四分五裂,可讀性不是很強。但是通過rxjava的鏈式調用以及線程切換,這樣的需求同樣能夠實現,並且代碼的閱讀性很強。
一、線程模式
1、四種線程模式
- Schedulers.io(): io流操作,網絡操作,文件流,耗時操作等異步操作
- Schedulers.newThread():比較常規的異步線程
- Schedulers.computation():需要cpu大量計算的線程
- AndroidSchedulers.mainThread():專供android切換到主線程
以上4種模式,io()和mainThread()模式是比較常用的。下面代碼測試上游和下游線程的切換
2、線程切換
測試代碼如下:
代碼中上游多次切換線程,下游也多次切換線程。測試結果如下:
結果發現,上游保持在主線程,下游也在主線程。所以可以得出2個結論:
- 上游線程切換,可以切換多次,以第一次爲準;下游線程切換,可以切換多次,以最後一次爲準。
- 上游使用 subscribeOn() 切換線程,下游使用 observeOn() 切換線程。
二、網絡下載圖片
瞭解到線程切換的原理,下面使用rxjava實現網絡下載圖片,並且顯示到UI界面上。
1、圖片地址
2、rxjava下載、並顯示圖片
使用過程中需要將上游切換到異步線程,下載完成後,需要將下游線程切換到主線程,最後在onNext()方法中顯示圖片。