Android-Architecture學習篇二:Mvp + Loaders

1 前言

Mvp模式學習之TODO-MVP-Loaders

It is based on theTODO-MVPsample and uses Loaders to get the data from the tasks repository.

基于Mvp模式基礎TODO-MVP泳唠,使用Loaders用任務請求獲取數(shù)據(jù)

2 基本結構

The advantages of Loaders, from theLoaders documentation page, are:

從Loaders文檔上可以看出担败,Loaders的優(yōu)點是:

They provide asynchronous loading of data, removing the need for callbacks in the repository.

Loaders提供異步加載數(shù)據(jù),移除庫repository中需要的請求回調。

They monitor the source of their data and deliver new results when the content changes, in our case, the repository.

Loaders會監(jiān)視數(shù)據(jù)來源,根據(jù)數(shù)據(jù)內容的變化,提供最新的的結果。

They automatically reconnect to the last loader when being recreated after a configuration change.

當Loaders被重新改變配置后,會自動重新連接到最后一個加載程序慎框。

3 Loaders實現(xiàn)目錄結構

4 Loaders實現(xiàn)分析

The Loaders (TaskLoaderandTasksLoader) are responsible for fetching the data and extend AsyncTaskLoader.

TaskLoader和TasksLoader都是繼承AsyncTaskLoader,負責取數(shù)據(jù)舆绎。

In?src/data/source/TasksLoader.java:

@Override

publicListloadInBackground() {

? ? ? return mRepository.getTasks();

}

The results are received in the UI Thread, handled by the presenter.

在UI線程接收結果鲤脏,用Presenter處理。

InTasksPresenter.java

Override

publicvoidonLoadFinished(Loader>loader,Listdata) {? ?

? ? mTasksView.setLoadingIndicator(false);??

? ? mCurrentTasks=data;if(mCurrentTasks==null) {? ? ? ?

? ? ? mTasksView.showLoadingTasksError();?

? ? }else{? ? ? ?

? ? ? ?showFilteredTasks();??

? ?}

}

The presenter also triggers the loading of data, like in the MVP sample but in this case it does it through the LoaderManager:

Presenter也使用加載數(shù)據(jù)吕朵,就像在MVP例子里一樣猎醇,但是它要通過LoaderManager來實現(xiàn)。

@Override

publicvoidstart() {? ?

? ? mLoaderManager.initLoader(TASKS_QUERY,null,this);

}

5 內容觀察 Content observer?

After every content change in the repository,notifyContentObserver()is called.

當庫中的內容變化的時候努溃,notifyContentObserver()i會被調用硫嘶。

In?src/data/source/TasksRepository.java: ??

@Override ?

publicvoiddeleteTask(@NonNull StringtaskId) {

? ? mTasksRemoteDataSource.deleteTask(checkNotNull(taskId));?

? ? mTasksLocalDataSource.deleteTask(checkNotNull(taskId));?

? ? mCachedTasks.remove(taskId);

? ? // Update the UI

? ? notifyContentObserver();

}

This notifies the Loader which in this case simply forces a reload of data.

這個通知Loader,Loader在這種情況下梧税,是一個簡單的強制加載數(shù)據(jù)的Loader

In?TasksLoader.java:

@Override

public void onTasksChanged() {

? ?if(isStarted()) {?

?? ? ? forceLoad();??


? ? }

}

6 類的解釋

Task:Immutable model class for a Task. 不可改變的Task模型

TasksDbHelper:Task數(shù)據(jù)幫助類

TasksLocalDataSource:Concrete implementation of a data source as a db. 作為數(shù)據(jù)庫的數(shù)據(jù)源的具體實現(xiàn)沦疾。

TasksPersistenceContract:The contract used for the db to save the tasks locally. 用于保存tasks保存到本地數(shù)據(jù)庫的Contract

TasksRemoteDataSource:Implementation of the data source that adds a latency simulating network.添加一個延遲模擬網絡的數(shù)據(jù)源的實現(xiàn)。

TaskLoader:Custom {@link android.content.Loader} for a {@link Task}, using the {@link TasksRepository} as its source. This Loader is a {@link AsyncTaskLoader} so it queries the data asynchronously. Task 的自定義加載Loader第队,用TasksRepository當成根源哮塞。這個Loader是一個AsyncTaskLoader,所以查詢數(shù)據(jù)是異步查詢的凳谦。

TasksDataSource:Main entry point for accessing tasks data.訪問任務數(shù)據(jù)的主要入口點忆畅。

For simplicity, only getTasks() and getTask() have callbacks. Consider adding callbacks to other methods to inform the user of network/database errors or successful operations.

為簡單起見,只gettasks()和gettask()有回調尸执〖铱考慮添加回調函數(shù)等方法來通知用戶網絡/數(shù)據(jù)庫錯誤或成功的行動。

For example, when a new task is created, it's synchronously stored in cache but usually every operation on database or network should be executed in a different thread.

例如如失,當一個新的任務被創(chuàng)建時绊诲,它的同步存儲在緩存中,但通常在數(shù)據(jù)庫或網絡上的每一個操作都應該在不同的線程中執(zhí)行褪贵。

TasksLoader:同TaskLoader

TasksRepository:Concrete implementation to load tasks from the data sources into a cache.具體實現(xiàn)從數(shù)據(jù)源加載到緩存中的任務掂之。

For simplicity, this implements a dumb synchronisation between locally persisted data and data obtained from the server, by using the remote data source only if the local database doesn't exist or is empty.

為簡單起見,這里實現(xiàn)了一個愚蠢的同步之間的局部堅持數(shù)據(jù)和數(shù)據(jù)從服務器獲取,只如果本地數(shù)據(jù)庫不存在或是空的使用遠程數(shù)據(jù)源板惑。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末橄镜,一起剝皮案震驚了整個濱河市偎快,隨后出現(xiàn)的幾起案子冯乘,更是在濱河造成了極大的恐慌,老刑警劉巖晒夹,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裆馒,死亡現(xiàn)場離奇詭異,居然都是意外死亡丐怯,警方通過查閱死者的電腦和手機喷好,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來读跷,“玉大人梗搅,你說我怎么就攤上這事⌒Ю溃” “怎么了无切?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長丐枉。 經常有香客問我哆键,道長,這世上最難降的妖魔是什么瘦锹? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任籍嘹,我火速辦了婚禮,結果婚禮上弯院,老公的妹妹穿的比我還像新娘辱士。我一直安慰自己,他們只是感情好听绳,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布颂碘。 她就那樣靜靜地躺著,像睡著了一般辫红。 火紅的嫁衣襯著肌膚如雪凭涂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天贴妻,我揣著相機與錄音切油,去河邊找鬼。 笑死名惩,一個胖子當著我的面吹牛澎胡,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼攻谁,長吁一口氣:“原來是場噩夢啊……” “哼稚伍!你這毒婦竟也來了?” 一聲冷哼從身側響起戚宦,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤个曙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后受楼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垦搬,經...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年艳汽,在試婚紗的時候發(fā)現(xiàn)自己被綠了猴贰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡河狐,死狀恐怖米绕,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情馋艺,我是刑警寧澤栅干,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站丈钙,受9級特大地震影響非驮,放射性物質發(fā)生泄漏。R本人自食惡果不足惜雏赦,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一劫笙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧星岗,春花似錦填大、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寥掐,卻和暖如春靴寂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背召耘。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工百炬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人污它。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓剖踊,卻偏偏與公主長得像庶弃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子德澈,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內容

  • 姑娘 別讓婚姻成為你唯一的追求 因為即將過年的關系梆造,陳西的相親日程越來越重缴守,從以前的每月一兩次變成了每周一兩次。 ...
    哎喲音樂閱讀 204評論 0 0
  • 花期有謝日 哀柳明自知 只嘆園中雨 下卻無時停 可憐幽草巖上留 可恨清風吹又生 茶舊遲待桂糕慕 葉舟不聞兩岸流 愿...
    臾止閱讀 286評論 0 2