成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android Loader詳解

移動開發 Android
裝載器從android3.0開始引進。它使得在activity或fragment中異步加載數據變得簡單。LoaderManager管理一個Activiry或Fragment中的一個或多個裝載器.但每個activity或fragment只擁有一個LoaderManager.

一、Android裝載器基本方法

裝載器從android3.0開始引進。它使得在activity或fragment中異步加載數據變得簡單。裝載器具有如下特性:

  • 它們對每個Activity和Fragment都有效。
  • 他們提供了異步加載數據的能力。
  • 它們監視數據源的一將一動并在內容改變時傳送新的結果。
  • 當由于配置改變而被重新創建后,它們自動重連到上一個加載器的游標,所以不必重新查詢數據。

裝載器API概述

在使用裝載器時,會涉及很多類和接口們,我們在下表中對它們總結一下:

Class/Interface

說明

LoaderManager 一個抽像類,關聯到一個Activity或Fragment,管理一個或多個裝載器的實例。這幫助一個應用管理那些與Activity或Fragment的生命周期相關的長時間運行的的操作。最常見的方式是與一個CursorLoader一起使用,然而應用是可以隨便寫它們自己的裝載器以加載其它類型的數據。

每個activity或fragment只有一個LoaderManager。但是一個LoaderManager可以擁有多個裝載器。LoaderManager.LoaderCallbacks一個用于客戶端與LoaderManager交互的回調接口。例如,你使用回調方法onCreateLoader()來創建一個新的裝載器。

Loader(裝載器)

一個執行異步數據加載的抽象類。它是加載器的基類。你可以使用典型的CursorLoader,但是你也可以實現你自己的子類。一旦裝載器被激活,它們將監視它們的數據源并且在數據改變時發送新的結果。AsyncTaskLoader提供一個AsyncTask來執行異步加載工作的抽象類。CursorLoaderAsyncTaskLoader的子類,它查詢ContentResolver然后返回一個Cursor。這個類為查詢cursor以標準的方式實現了裝載器的協議,它的游標查詢是通過AsyncTaskLoader在后臺線程中執行,從而不會阻塞界面。使用這個裝載器是從一個ContentProvider異步加載數據的***方式。相比之下,通過fragment或activity的API來執行一個被管理的查詢就不行了。

二、啟動一個裝載器

LoaderManager管理一個Activiry或Fragment中的一個或多個裝載器.但每個activity或fragment只擁有一個LoaderManager.

你通常要在activity的onCreate()方法中或fragment的onActivityCreated()方法中初始化一個裝載器.你可以如下創建:

  1. // 準備裝載器.可以重連一個已經存在的也可以啟動一個新的. 
  2. getLoaderManager().initLoader(0,null, this); 

 initLoader()方法有以下參數:

  • 一個唯一ID來標志裝載器.在這個例子中,ID是0.
  • 可選的參數,用于裝載器初始化時(本例中是null).
  • 一個LoaderManager.LoaderCallbacks的實現.被LoaderManager調用以報告裝載器的事件,在這個例子中,類本實現了這個接口,所以傳的是它自己:this.initLoader()保證一個裝載器被初始化并激活.它具有兩種可能的結果:
  • 如果ID所指的裝載器已經存在,那么這個裝載器將被重用.
  • 如果裝載器不存在,initLoader()就觸發LoaderManager.LoaderCallbacks的方法onCreateLoader().這是你實例化并返回一個新裝載器的地方.

在這兩種情況中,傳入的LoaderManager.LoaderCallbacks的實現都與裝載器綁定在一起.并且會在裝載器狀態變化時被調用.如果在調用這個方法時,調用者正處于啟動狀態,并且所請求的裝載器已存在并產生了數據,那么系統會馬上調用onLoadFinished()(也就是說在initLoader()還在執行時).所以你必須為這種情況的發生做好準備.

注意initLoader()返回所創建的裝載器,但是你不需保存一個對它的引用.LoaderManager自動管理裝載器的生命.LoaderManager會在需要時開始和停止裝載動作,并且維護裝載器的狀態和它所關聯的內容.這意味著,你很少與裝載器直接交互.你通常都是使用LoaderManager.LoaderCallbacks的方法們在某個事件發生時介入到數據加載的過程中.

三、重啟裝載器

當你使用initLoader()時,如果指定ID的裝載器已經存在,則它使用這個裝載器.如果不存在呢,它將創建一個新的.但是有時你卻是想丟棄舊的然后開始新的數據.

要想丟棄舊數據,你應使用restartLoader().例如,下面這個SearchView.OnQueryTextListener的實現在用戶查詢發生改變時重啟了裝載器,裝載器于是需重啟從而能使用新的搜索過慮來進行一次新的查詢. 

  1. public boolean onQueryTextChanged(String newText) {   
  2.     // 當動作欄的搜索字串發生改時被調用.   
  3.     // 更新搜索過慮,然后重新啟動裝載利用這個新過慮進行新的查詢.   
  4.     mCurFilter = !TextUtils.isEmpty(newText) ? newText : null;   
  5.     getLoaderManager().restartLoader(0, null, this);   
  6.     return true;   
  7. LoaderManager.LoaderCallbacks是一個回調接口,它使得客戶端可以與LoaderManager進行交互. 
  8. 裝載器,一般指的是CursorLoader,我們希望在它停止后依然保持數據.這使得應用可以在activity或fragment的 onStop() 和onStart() 之間保持數據,所以當用戶回到一個應用時,它們不需等待數據加載.你使用LoaderManager.LoaderCallbacks 的方法們,在需要時創建新的裝載器,并且告訴應用什么時候要停止使用裝載器的數據. 
  9. LoaderManager.LoaderCallbacks 包含以下方法們: 
  10. onCreateLoader() —跟據傳入的ID,初始化并返回一個新的裝載器. 
  11. onLoadFinished() —當一個裝載器完成了它的裝載過程后被調用. 
  12. onLoaderReset() —當一個裝載器被重置而什其數據無效時被調用. 
  13.  
  14. 當你試圖去操作一個裝載器時(比如,通過initLoader()),會檢查是否指定ID的裝載器已經存在.如果它不存在,將會觸發LoaderManager.LoaderCallbacks 的方法onCreateLoader().這是你創建一個新裝載器的地方.通常這個裝載器是一個CursorLoader,但是你也可以實現你自己的裝載器. 

  

  1. String mCurFilter; 
  2. ... 
  3. public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
  4. // 這里是在需要創建新裝載器時被調用的. 
  5. // 我們只是簡單的擁有一個裝載器,所以我們不需要關心ID. 
  6. // First, pick the base URI to use depending on whether we are 
  7. // currently filtering. 
  8. Uri baseUri; 
  9. if (mCurFilter != null) { 
  10. baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 
  11. Uri.encode(mCurFilter)); 
  12. else { 
  13. baseUri = Contacts.CONTENT_URI; 
  14. // Now create and return a CursorLoader that will take care of 
  15. // creating a Cursor for the data being displayed. 
  16. String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND (" 
  17. + Contacts.HAS_PHONE_NUMBER + "=1) AND (" 
  18. + Contacts.DISPLAY_NAME + " != '' ))"
  19. return new CursorLoader(getActivity(), baseUri, 
  20. CONTACTS_SUMMARY_PROJECTION, selectnull
  21. Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); 

 

責任編輯:龐桂玉 來源: Android開發中文站
相關推薦

2017-11-28 15:36:25

換扶技術Android資源

2021-08-12 09:48:21

Webpack Loa工具Webpack

2011-04-18 09:46:37

Java

2014-07-24 09:11:34

2013-11-14 16:50:08

2014-07-28 10:09:30

Android

2011-05-27 15:02:15

Android ListView

2013-11-14 10:42:48

MTPAndroid

2021-05-31 05:36:43

WebpackJavaScript 前端

2021-04-30 08:28:15

WebpackLoaderPlugin

2013-12-25 09:34:26

Android SDKAndroid組件

2011-09-09 20:14:58

Android Wid

2013-01-11 13:48:41

Android開發組件Notificatio

2013-01-10 14:39:28

Android開發Content Pro組件

2010-07-13 09:02:19

Widget開發

2021-09-07 08:49:35

Android

2022-05-29 17:37:39

LinuxUbuntuPHP

2011-05-31 09:36:46

Android 布局屬性

2011-09-07 13:18:40

Android Wid

2011-09-09 16:23:16

Android Web測試
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天综合网7799精品 | 国产高清免费视频 | 久久久久久久久久一区二区 | 成人一区二区三区在线观看 | 国产在线1区 | 99热在线观看精品 | 第四色影音先锋 | 欧美日韩精品专区 | 日本精品视频一区二区 | 亚洲精品久久久久久久久久久 | 日韩欧美一区二区三区免费看 | 欧美成人一区二区三区 | 精品国产乱码久久久久久闺蜜 | 一区欧美 | 日韩欧美在线播放 | 婷婷91| 一区二区三区四区在线 | 欧美日韩久 | 91精品一区 | 国产一区欧美一区 | 91精品国产综合久久久久久 | 亚洲一区二区电影在线观看 | 日韩免费成人av | 一本综合久久 | 久久久91精品国产一区二区三区 | 欧美精品片 | 国内久久精品 | 国产一区二区三区四区五区加勒比 | 欧美精品一区三区 | 日韩精品免费一区二区在线观看 | 久久久久一区 | 国产特级毛片aaaaaa喷潮 | 一区二区三区国产精品 | 亚洲欧美在线一区 | 成年人免费在线视频 | 四虎成人免费视频 | 91视频一区二区 | 在线视频日韩 | 国产美女视频黄a视频免费 国产精品福利视频 | 99国产精品一区二区三区 | 久久一区二区精品 |