亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android 官方示例:android-architecture 學習筆記(三)之todo-mvp-loaders

2019-11-09 18:32:19
字體:
來源:轉載
供稿:網友

項目地址:https://github.com/googlesamples/android-architecture/tree/todo-mvp-loaders/

項目結構

本項目基于todo-mvp(后文所說”對比之前的項目”,即是說的它),并使用Loaders機制來獲取數據,如圖: 這里寫圖片描述 圖示,P通過Loaders獲取數據M 本文MVP相關的就不再重復解釋了

data模塊

這里寫圖片描述 對比之前的項目,多了兩個類: TaskLoader —— 獲取一條Task數據的Loader TasksLoader —— 獲取一個List<Task>數據的Loader

TasksLoader分析

引用一段官方關于Loaders的中文解釋:

Android 3.0 中引入了加載器(即Loaders),支持輕松在 Activity 或片段中異步加載數據。 加載器具有以下特征:

可用于每個 Activity 和 Fragment。 支持異步加載數據。 監控其數據源并在內容變化時傳遞新結果。 在某一配置更改后重建加載器時,會自動重新連接上一個加載器的游標。 因此,它們無需重新查詢其數據。

TasksLoader完整源碼

public class TasksLoader extends AsyncTaskLoader<List<Task>> implements TasksRepository.TasksRepositoryObserver{ PRivate TasksRepository mRepository; public TasksLoader(Context context, @NonNull TasksRepository repository) { super(context); checkNotNull(repository); mRepository = repository; } @Override public List<Task> loadInBackground() { return mRepository.getTasks(); } @Override public void deliverResult(List<Task> data) { if (isReset()) { return; } if (isStarted()) { super.deliverResult(data); } } @Override protected void onStartLoading() { // Deliver any previously loaded data immediately if available. if (mRepository.cachedTasksAvailable()) { deliverResult(mRepository.getCachedTasks()); } // Begin monitoring the underlying data source. mRepository.addContentObserver(this); if (takeContentChanged() || !mRepository.cachedTasksAvailable()) { // When a change has been delivered or the repository cache isn't available, we force // a load. forceLoad(); } } @Override protected void onStopLoading() { cancelLoad(); } @Override protected void onReset() { onStopLoading(); mRepository.removeContentObserver(this); } @Override public void onTasksChanged() { if (isStarted()) { forceLoad(); } }}

分析如上代碼: a. TasksLoader繼承了AsyncTaskLoader,并實現TasksRepository.TasksRepositoryObserver接口 b. 結合LoaderManager、Loader、AsyncTaskLoader源碼(這里就不全貼了)與官方文檔,可分析出幾個重寫方法的調用周期: onStartLoading —— 開始加載數據 loadInBackground —— 在后臺加載數據,即異步線程 deliverResult —— 加載完成數據后,進行分發,通過追源碼,其實就是在Loader中定義了一個回調接口,可以用于處理 onStopLoading —— 停止加載數據 onReset —— 當需要回收destroy時,由LoaderManger調用 c. onStartLoading() 代碼解釋:如果數據倉庫中緩存了數據,則直接分發;注冊數據改變的觀察接口;若數據改變 或 首次加載未緩存時,調用forceLoad() d. forceLoad() 調用 AsyncTaskLoader#onForceLoad(),從而開始數據異步加載任務

tasks模塊分析

接下來挑一個業務模塊分析一下(其它模塊大同小異),比如tasks TasksPresenter主要代碼:

public class TasksPresenter implements TasksContract.Presenter, LoaderManager.LoaderCallbacks<List<Task>> { private final static int TASKS_QUERY = 1; private final TasksRepository mTasksRepository; private final TasksContract.View mTasksView; private final TasksLoader mLoader; private final LoaderManager mLoaderManager; private List<Task> mCurrentTasks; private TasksFilterType mCurrentFiltering = TasksFilterType.ALL_TASKS; private boolean mFirstLoad; public TasksPresenter(@NonNull TasksLoader loader, @NonNull LoaderManager loaderManager, @NonNull TasksRepository tasksRepository, @NonNull TasksContract.View tasksView) { mLoader = checkNotNull(loader, "loader cannot be null!"); mLoaderManager = checkNotNull(loaderManager, "loader manager cannot be null"); mTasksRepository = checkNotNull(tasksRepository, "tasksRepository cannot be null"); mTasksView = checkNotNull(tasksView, "tasksView cannot be null!"); mTasksView.setPresenter(this); } @Override public void start() { mLoaderManager.initLoader(TASKS_QUERY, null, this); } @Override public Loader<List<Task>> onCreateLoader(int id, Bundle args) { mTasksView.setLoadingIndicator(true); return mLoader; } @Override public void onLoadFinished(Loader<List<Task>> loader, List<Task> data) { mTasksView.setLoadingIndicator(false); mCurrentTasks = data; if (mCurrentTasks == null) { mTasksView.showLoadingTasksError(); } else { showFilteredTasks(); } } private void showFilteredTasks() { List<Task> tasksToDisplay = new ArrayList<>(); if (mCurrentTasks != null) { for (Task task : mCurrentTasks) { switch (mCurrentFiltering) { case ALL_TASKS: tasksToDisplay.add(task); break; case ACTIVE_TASKS: if (task.isActive()) { tasksToDisplay.add(task); } break; case COMPLETED_TASKS: if (task.isCompleted()) { tasksToDisplay.add(task); } break; default: tasksToDisplay.add(task); break; } } } processTasks(tasksToDisplay); }}

在start()中,

mLoaderManager.initLoader(TASKS_QUERY, null, this);

初始化了LoaderManager,則會調用

@Override public Loader<List<Task>> onCreateLoader(int id, Bundle args) { mTasksView.setLoadingIndicator(true); return mLoader; }

mLoader就被mLoaderManager所管理 當TasksLoader的加載任務開始后,會調用TasksLoader#loadInBackground():

public List<Task> loadInBackground() { return mRepository.getTasks(); }

至此,數據加載流程就分析完了。然后再交由View來顯示就是了

而TasksRepository(M,不由P直接操作)、TasksLoader(由P直接操作,它再去操作TasksRepository)、TasksFragment(V)、TasksPresenter(P),都在Activity中進行初始化


上一篇:Android 單元測試

下一篇:Android 布局介紹

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
青青草成人在线| 中文字幕九色91在线| 亚洲精品720p| 欧美视频在线观看免费网址| 亚洲国产精品嫩草影院久久| 久久久噜噜噜久久久| 欧美日本在线视频中文字字幕| 一本色道久久88亚洲综合88| 亚洲欧洲一区二区三区在线观看| 成人免费高清完整版在线观看| 日韩精品中文在线观看| 欧美裸体xxxxx| 成人在线一区二区| www.午夜精品| 日韩精品在线视频美女| 欧美精品精品精品精品免费| 久久人91精品久久久久久不卡| 97成人超碰免| 日韩成人av一区| 欧美激情小视频| 国产欧美日韩免费看aⅴ视频| 日韩美女主播视频| 亚洲电影在线观看| 亚洲精品720p| 中文亚洲视频在线| 一级做a爰片久久毛片美女图片| 国产日韩欧美电影在线观看| 国产精品视频久久| 国产成人免费av电影| 欧美视频免费在线观看| 亚洲午夜av电影| 国产成人精品国内自产拍免费看| 国模视频一区二区三区| 欧美巨猛xxxx猛交黑人97人| 91在线观看免费观看| 久久精品影视伊人网| 国产91精品青草社区| 2018国产精品视频| 国产日产欧美精品| 国产亚洲人成a一在线v站| 欧美精品一区二区三区国产精品| 久久久综合av| 55夜色66夜色国产精品视频| 午夜精品www| 91色视频在线观看| 成人性生交大片免费观看嘿嘿视频| 亚洲国产精品va在线观看黑人| 国产精品久久一区| 91精品国产高清久久久久久久久| 国产成人精品在线播放| 欧美亚洲成人免费| 懂色av一区二区三区| 97视频免费在线观看| 亚洲已满18点击进入在线看片| 狠狠久久亚洲欧美专区| 青青久久av北条麻妃黑人| 最近中文字幕mv在线一区二区三区四区| 91精品啪aⅴ在线观看国产| 色综合亚洲精品激情狠狠| 九色精品美女在线| 精品成人乱色一区二区| 欧美影院在线播放| 亚洲嫩模很污视频| 亚洲精品女av网站| www.久久久久久.com| 亚洲一区二区三区xxx视频| 黑丝美女久久久| 亚洲国产精品va在线观看黑人| 国内精品久久久久久中文字幕| 精品国产91久久久久久| 亚洲在线第一页| 国产999精品久久久| 亚洲欧美精品在线| 久久久久久一区二区三区| 久久综合亚洲社区| 日韩国产一区三区| 中文字幕精品国产| 777国产偷窥盗摄精品视频| 91精品国产色综合| 亚洲欧美国产一区二区三区| 粗暴蹂躏中文一区二区三区| 成人妇女免费播放久久久| 日韩免费看的电影电视剧大全| 欧美日韩亚洲天堂| 久久成人精品电影| 久久伊人精品天天| 亚洲a区在线视频| 成人免费看黄网站| 中文字幕亚洲综合久久| 欧美最猛性xxxxx(亚洲精品)| 日本久久久久亚洲中字幕| 国产精品视频成人| 国产99久久精品一区二区 夜夜躁日日躁| 96sao精品视频在线观看| 久久久女人电视剧免费播放下载| 亚洲天天在线日亚洲洲精| 欧美一级电影久久| 国产精品91在线观看| 亚洲美女免费精品视频在线观看| 91精品91久久久久久| 亚洲人成电影网站色| 日韩精品欧美国产精品忘忧草| 欧洲成人免费aa| 亚洲天堂免费视频| 免费成人高清视频| 国产精品极品美女粉嫩高清在线| 欧美老少做受xxxx高潮| 久久亚洲精品中文字幕冲田杏梨| 欧美精品性视频| 国产精品成熟老女人| 欧美一区三区三区高中清蜜桃| 欧美性xxxx| 91精品国产成人| 国产精品草莓在线免费观看| 欧美性资源免费| 欧美性一区二区三区| 青青草一区二区| 久久国产精彩视频| 亚洲精品视频免费在线观看| 亚洲精品国产精品久久清纯直播| 精品久久久久久中文字幕大豆网| 国产精品入口日韩视频大尺度| 亚洲另类激情图| 国产精品高潮呻吟久久av黑人| 亚洲美女自拍视频| 亚洲va欧美va国产综合久久| 日韩欧美中文字幕在线观看| 91国语精品自产拍在线观看性色| 国产精品视频999| 欧美日韩激情小视频| 国产成人精品免高潮在线观看| 欧美老肥婆性猛交视频| 欧美性xxxx极品hd欧美风情| 国产日韩在线视频| 久久99视频精品| 2021久久精品国产99国产精品| 欧美成人一区二区三区电影| 亚洲iv一区二区三区| 亚洲一区免费网站| 成人网在线免费看| 久久精品小视频| 亚洲国产精品成人一区二区| 精品亚洲男同gayvideo网站| 成人黄色免费看| 中文日韩在线视频| 欧美激情精品久久久久久蜜臀| 中文字幕视频一区二区在线有码| 国产精品99久久久久久久久| 亚洲美女在线视频| 日韩中文综合网| 精品国产网站地址| 久久免费少妇高潮久久精品99| 亚洲自拍偷拍视频| 在线观看91久久久久久| 91av网站在线播放| 国产激情视频一区| 亚洲激情电影中文字幕| 另类专区欧美制服同性| 欧美另类暴力丝袜| 日韩视频在线免费观看| 国产亚洲aⅴaaaaaa毛片| 青青精品视频播放| 色av中文字幕一区| 欧美性xxxx极品hd满灌|