Android Loader的使用以及手機(jī)通訊錄的獲取方法
Android的主線程中執(zhí)行長(zhǎng)時(shí)間操作,導(dǎo)致界面無響應(yīng),會(huì)引起ANR。如果需要執(zhí)行較長(zhǎng)時(shí)間的操作,一般會(huì)在另一個(gè)線程處理,然后將數(shù)據(jù)轉(zhuǎn)交給主線程進(jìn)行顯示,Android本身為我們提供了一些機(jī)制處理這種情況,今天就來看看Loader。Loader主要用來在Activity和Fragment中異步加載數(shù)據(jù),使用也非常簡(jiǎn)單。
Loader的初始化非常簡(jiǎn)單,Activity提供了獲取LoaderManager的接口,之后調(diào)用LoaderManager的initLoader即可。initLoader接受三個(gè)參數(shù):
Loader的唯一標(biāo)識(shí)符ID,用來區(qū)分多個(gè)Loader;
傳遞給Loader的參數(shù),可選;
Loader的回調(diào)。
銷毀Loader,只需要使用LoaderManager的destoryLoader即可,參數(shù)只傳遞一個(gè)Loader的ID。
Loader的回調(diào)接口LoaderCallbacks有三個(gè)方法:
public interface LoaderCallbacks<D> {
Loader<D> onCreateLoader(int var1, Bundle var2);
void onLoadFinished(Loader<D> var1, D var2);
void onLoaderReset(Loader<D> var1);
}
onCreateLoader在Loader創(chuàng)建時(shí)被調(diào)用;
onLoadFinished在Loader加載數(shù)據(jù)完成時(shí)調(diào)用;
onLoaderReset在Loader被reset時(shí)被調(diào)用。
Loader接口就這些,我們通過一個(gè)實(shí)際的應(yīng)用案例看看怎么使用Loader,這里選擇了手機(jī)通信錄的獲取,獲取手機(jī)的通信錄信息,需要使用Phone的ContentProvider,下面例子中詳細(xì)來看。
由于要訪問通信錄,需要在manifest文件添加權(quán)限:
<uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.CALL_PHONE"/>
activity_main.xml非常的簡(jiǎn)單,就包括一個(gè)ListView,用來顯示通訊錄列表。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.yjp.contractgetter.MainActivity">
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
MainActivity類的代碼比較長(zhǎng),我們分解來看,MainActivity要實(shí)現(xiàn)LoaderCallbacks接口
class MainActivity : AppCompatActivity(), LoaderManager.LoaderCallbacks<Cursor> {
使用Kotlin的伙伴對(duì)象,定義了靜態(tài)成員變量,LOADER_ID是Loader的ID,PHONE_PROJECTION是查詢通訊錄時(shí)希望查找的列集合
companion object {
private val LOADER_ID = 0
private val PHONE_PROJECTION = arrayOf(Phone._ID, Phone.DISPLAY_NAME, Phone.NUMBER)
}
onCreate使用SimpleCursorAdapter作為L(zhǎng)istView的Adapter,然后調(diào)用initLoader初始化了Loader
private var mAdapter:SimpleCursorAdapter? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mAdapter = SimpleCursorAdapter(this,
android.R.layout.simple_list_item_2,
null,
arrayOf(Phone.DISPLAY_NAME, Phone.NUMBER),
intArrayOf(android.R.id.text1, android.R.id.text2),
0)
listView.adapter = mAdapter
listView.onItemClickListener = AdapterView.OnItemClickListener {
_, _, position, _ ->
val cursor = listView.getItemAtPosition(position) as Cursor
val displayNameIndex = cursor.getColumnIndex(Phone.DISPLAY_NAME)
Toast.makeText(this, cursor.getString(displayNameIndex), Toast.LENGTH_SHORT).show()
}
loaderManager.initLoader(LOADER_ID, null, this)
}
onDestory銷毀Loader
override fun onDestroy() {
super.onDestroy()
loaderManager.destroyLoader(LOADER_ID)
}
三個(gè)回調(diào)方法:
override fun onCreateLoader(id: Int, bundle: Bundle?): Loader<Cursor> {
return CursorLoader(this,
Phone.CONTENT_URI,
PHONE_PROJECTION,
null,
null,
Phone.DISPLAY_NAME)
}
override fun onLoaderReset(cursor: Loader<Cursor>?) {
mAdapter?.swapCursor(null)
}
override fun onLoadFinished(loader: Loader<Cursor>?, cursor: Cursor?) {
mAdapter?.swapCursor(cursor)
}
onCreateLoader創(chuàng)建了一個(gè)CursorLoader,該Loader回執(zhí)行ContentProvider的操作,然后返回一個(gè)cursor;
onLoaderReset時(shí),將Adapter中的cursor置null;
onLoadFinished時(shí),由于CursorLoader查詢完數(shù)據(jù),會(huì)返回新的cursor,我們使用新的Cursor去替換之前Adapter中的cursor。
這樣,我們就可以在Activity啟動(dòng)時(shí)自動(dòng)異步加載數(shù)據(jù)了,手機(jī)上試試,可以發(fā)現(xiàn),加載非常順暢。github已上傳代碼。
以上這篇Android Loader的使用以及手機(jī)通訊錄的獲取方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android通過AIDL在兩個(gè)APP之間Service通信
這篇文章主要為大家詳細(xì)介紹了Android通過AIDL在兩個(gè)APP之間Service通信,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
android為L(zhǎng)istView每個(gè)Item上面的按鈕添加事件
本篇文章主要介紹了android為L(zhǎng)istView每個(gè)Item上面的按鈕添加事件,有興趣的同學(xué)可以了解一下。2016-11-11
Android自定義View繪圖實(shí)現(xiàn)拖影動(dòng)畫
這篇文章主要介紹了Android自定義View繪圖實(shí)現(xiàn)拖影動(dòng)畫,,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
Android FTP服務(wù)器上傳文件攻略(代碼詳解)
這篇文章主要介紹了Android FTP服務(wù)器上傳文件攻略,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
Android圖片上傳實(shí)現(xiàn)預(yù)覽效果
這篇文章主要介紹了Android圖片上傳實(shí)現(xiàn)預(yù)覽效果的相關(guān)資料,需要的朋友可以參考下2016-01-01
Android圖片加載利器之Picasso擴(kuò)展功能
這篇文章主要為大家詳細(xì)介紹了Android圖片加載利器之Picasso擴(kuò)展功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03

