當前位置:
首頁 > 最新 > Google I/O大會上的最新發布

Google I/O大會上的最新發布

來這裡找志同道合的小夥伴!

作 者 簡 介

郭海生

Android高級工程師,6年以上開發經驗,有豐富的代碼重構和架構設計經驗,負責京東商城我的京東的開發工作,熱衷於學習和研究新技術。

>>>>

導讀

美國當地時間2018年5月8日,Google I/O大會上發布了 Android Jetpack 。將之前發布的一系列組件比如 Lifecycle、LiveData、Room、ViewModel等進行融合從而推出了一套官方認證的開發體系Android Jetpack。這套體系分為架構(Architecture)、UI、基礎(Foundation)以及行為(Behavior)四個方面。

谷歌官方架構組件圖:

這次的Android Jetpack推出了五個新組件,它們分別是:Navigation(導航組件)、Paging(分頁組件)、WorkManager(處理類似後台任務組件)、Slices(切片)、Android KTX(Kotiln擴展程序)

>>>>

背景

現有的 Android API 允許內容的分頁,但是都有明顯的限制和缺陷:

CursorAdapter(https://developer.android.com/reference/android/widget/CursorAdapter.html)使得獲取資料庫查詢結果更加容易的映射到ListView項目中,但是它的查詢操作是在UI線程上運行的,並且以低效的方式使用Cursor。

AsyncListUtil(https://developer.android.com/reference/android/support/v7/util/AsyncListUtil)允許把基於位置position的數據分頁放進RecyclerView,但是不支持非位置position的數據,並且強制空數據集中的空位佔位符。

>>>>

Paging Library詳解

>>>>Paging Library簡介

「The Paging Library makes it easier for youto load data gradually and gracefully within your app"s RecyclerView.

Many apps consume data from a data sourcethat contains a large number of items, but only display a small portion at atime.

The Paging Library helps your app observeand display a reasonable subset of this data.」

翻譯】:

Paging library 可以讓你漸進的載入數據到你的數據源,而且可以優雅的配合RecyclerView使用。

許多app經常性從大量數據源里載入數據,但是在某個時刻卻只需要展示這些數據的一小部分。Paging library可以幫助你的app觀察和展示一個合理的數據集合。

>>>>Paging Library 庫的架構

從圖中可以看出,Paging是圍繞PagedList為中心的,遵循數據驅動的思想。

>>>>DataSource

DataSource是PagedList的數據源類。Key相當於載入數據的條件信息,Value對應返回的結果。Paging提供了三種DataSource的實現:

PageKeyedDataSource:適用於以頁信息載入數據的場景。比如在網路載入數據的時候,需要傳Next或者Previous作為鍵值參數。

ItemKeyedDataSource:適用於所載入的數據依賴其他現有數據信息的場景。比如載入第N+1條需要第N條的數據,這時候需要傳第N條的數據過去。

PositionalDataSource:適用於數據總量固定,支持從特定位置載入數據的場景。比如返回從1200條開始的200條數據。

三種DataSource相同點:都有loadInitial()抽象方法,各自都封裝了請求初始化數據的參數類型LoadInitialParams和接受請求參數的LoadInitialCallback。

不同點:PageKeyedDataSource和ItemKeyedDataSource需要實現loadBefore()和loadAfter()方法,而PositionalDataSource需要實現loadRange()方法。

可以看出,DataSource不是真正的數據源,而是負責從數據源載入數據,承擔了PagedList與數據源之間的橋樑。

>>>>PagedList

PagedList從DataSource中獲取數據,通過PagedList.Config 可以配置一次載入的數量以及預載入的數量,它也為RecyclerView.Adapter提供更新信號,驅動UI的刷新。它提供了五個成員變數如下:

mMainThreadExecutor:主線程的Executor, 可以將結果post到主線程。

mBackgroundThreadExecutor:後台線程的Executor。

BoundaryCallback:載入Datasource中的數據載入到邊界時的回調。

PagedList.Config可配置的屬性:

setPageSize:設置每頁載入的數量。

setInitialLoadSizeHint:初始化數據時候載入數量。

setPrefetchDistance:預載入數量,設置距離最後還剩多少個item開始載入下一頁的數據。

setEnablePlaceholders:當Item為null時是否使用PlaceHolder展示。

PagedStorage:用於存儲載入到的數據,它包含一個ArrayList

>對象mPages,按頁存儲數據。

>>>>PagedListAdapter

PagedListAdapter繼承於RecycleView.Adapter,用來在RecycleView中顯示PagedList 的數據。當拖動RecycleView載入每一頁數據的時候,PagedListAdaptert通過DiffUtil在後台線程計算PagedList細粒度的變化並返回給自己一個新的PagedList,然後調用自己的notifyItem……()做刷新等操作。

>>>>AsyncPageListDiffer

AsyncPageListDiffer是一個輔助類,可以將PagedList數據更方便的映射到PagedListAdapter里。我們通常都是用LiveData承載PagedList對象,當數據變化的時候通過Lifecycles能收到通知,我們可以調用PagedListAdapter的submitList(PagedList)方法更新數據。AsyncPageListDiffer能監聽到PagedList的載入Callbacks,通過DiffUtils在後台線程可拿到最新的數據集合。AsyncPageListDiffer為我們提供了getItem(int)和getItemCount()方法,這個可以配合PagedListAdapter呈現數據。

>>>>Paging Library 載入數據流程

如上圖所示,Paging載入數據是在後台線程進行的,載入完成後在主線程顯示。

當創建LiveData

時候,LiveData會新建一個線程從DataSource中載入數據(觸發loadInitial()),DataSource載入到數據會更新PagedList,PagedList更新會通知PagedAdapter,PagedAdapter會利用DiffUtil對比現在的Item和更新的Item的差異,對比結束後會確定是否刷新UI。

刷新UI,UI顯示會觸發PagedAdapter的getItem操作,隨即觸發PagedList的loadAround方法從DataSource載入周圍的數據。

可以看出,整個過程Paging內部實現了線程的切換,數據的預載入,所有聯動都是在Paging中,使用者只用關心載入數據的具體實現。

>>>>Paging Library的使用方法

1、Gradle依賴

https://developer.android.com/topic/libraries/architecture/adding-components#paging

2、構造可觀察的PagedList對象

userDao是model對象,可以從資料庫取到User返回DataSource.Factory對象,我們將DataSource.Factory傳給LivePagedListBuilder,並配置PagedList,可以返回一個LiveData對象

3、構建數據源對象

我們用DataSource建立分頁數據源,實現了ItemKeyedDataSource對應的抽象方法,定義載入第一頁以及後面每一頁數據。

4、PagedListAdpater建立與數據的綁定

5、MainActivity初始化UI、訂閱數據源狀態從而更新UI

>>>>

總結


Paging Library通過配合Lifecycle、ViewModel、LiveData等組件的特性,為我們提供了一個簡單、安全、靈活的分頁載入組件,其核心思想上以數據為驅動,我們只需關心載入數據的具體實現,並且在用戶體驗上,Paging Library逐步從數據源載入信息,從而不會耗費過多的設備資源或是等待太長的時間。

>>>>

具體使用方法請參考

官網:

https://developer.android.com/topic/libraries/architecture/paging/

googlecodelabs關於paginglibrary的使用方法:

https://codelabs.developers.google.com/codelabs/android-paging/index.html

官方demo:

https://github.com/googlesamples/android-architecture-components/tree/master/PagingWithNetworkSample

特別鳴謝:

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2017/0920/8533.html

京東技術∣關注技術的公眾號

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 京東技術 的精彩文章:

分散式資源管理與作業調度
都已經禁止調用私有API了,你還不重視Android P怎麼行

TAG:京東技術 |