先上效果圖: 獲取手機已安裝的App列表利用Android系統API就可以辦到,這裡為什麼要引入RxJava?現在我們假設一下有下麵幾個需求: 1、我們不需要所有的App,只需要用戶安裝的第三方App,即過濾到系統App; 2、我們自定義一個AppInfo類,該類中保存了App_Icon、App_N ...
先上效果圖:
獲取手機已安裝的App列表利用Android系統API就可以辦到,這裡為什麼要引入RxJava?現在我們假設一下有下麵幾個需求:
1、我們不需要所有的App,只需要用戶安裝的第三方App,即過濾到系統App;
2、我們自定義一個AppInfo類,該類中保存了App_Icon、App_Name、App_VersionName等屬性,而Android系統提供的API我們之恩那個獲取ApplicationInfo,這樣就存在一個類型轉換;
3、獲取Application信息,過濾數據這些操作都是相對耗時的操作,我們需要在工作線程進行操作,獲取數據後,我們又需要切換到UI線程進行結果的顯示,這又涉及到線程的切換。
基於上面的需求,我們用傳統的java代碼來實現,相對來說比較麻煩,既然RxJava現在這麼火,我們就利用RxJava來實現上面的幾個需求。本文所涉及的RxJava操作符主要包括filter、map兩個操作符。
一、定義一個AppInfo類,用來保存我們需要顯示的信息
二、定義一個Adapter
三、顯示頁面
顯示頁面主要是一個RecyclerView列表,用來展示手機中已經安裝的App列表。佈局什麼的就不多說了,直接上代碼:
通過getInstalledApp方法,我們可以獲取到系統的安裝的應用的PackageInfo,在getAllApp剛發中,通過subscriber.onNext(info)發送PackageInfo;由於PackageInfo中包含了所有的App信息,而這並不是我們需要的,我們只需要用戶安裝的App就可以,這樣就要求過濾掉系統App,RxJava提供了一個filter操作符來進行過濾操作,通過map操作我們就可以把系統應用過濾掉;另外,我們需要將獲得的PackageInfo轉換為我們定義的AppInfo類型,而RxJava只需要一個map操作符就能完成轉換,這樣就可以把獲取的App信息保存到AppInfo類中。
通過上面的過濾和變換之後,我們就可以得到AppInfo,然後在onNext方法中通過mData.add(appInfo)把結果添加進List集合中,onCompleted方法中通知Adapter進行更新mAdapter.notifyDataSetChanged()。
看似複雜的一系列需求,得益於RxJava優秀API設計,使得數據的過濾、變換等操作變得十分簡單,同時RxJava的流式API設計,即使我們的邏輯很複雜的情況下,RxJava能夠依然保持我們代碼邏輯的簡潔和易懂。