国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android Loader的使用以及手機通訊錄的獲取方法

2019-10-22 18:18:00
字體:
供稿:網(wǎng)友

Android的主線程中執(zhí)行長時間操作,導(dǎo)致界面無響應(yīng),會引起ANR。如果需要執(zhí)行較長時間的操作,一般會在另一個線程處理,然后將數(shù)據(jù)轉(zhuǎn)交給主線程進行顯示,Android本身為我們提供了一些機制處理這種情況,今天就來看看Loader。Loader主要用來在Activity和Fragment中異步加載數(shù)據(jù),使用也非常簡單。

Loader的初始化非常簡單,Activity提供了獲取LoaderManager的接口,之后調(diào)用LoaderManager的initLoader即可。initLoader接受三個參數(shù):

Loader的唯一標(biāo)識符ID,用來區(qū)分多個Loader;

傳遞給Loader的參數(shù),可選;

Loader的回調(diào)。

銷毀Loader,只需要使用LoaderManager的destoryLoader即可,參數(shù)只傳遞一個Loader的ID。

Loader的回調(diào)接口LoaderCallbacks有三個方法:

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)建時被調(diào)用;

onLoadFinished在Loader加載數(shù)據(jù)完成時調(diào)用;

onLoaderReset在Loader被reset時被調(diào)用。

Loader接口就這些,我們通過一個實際的應(yīng)用案例看看怎么使用Loader,這里選擇了手機通信錄的獲取,獲取手機的通信錄信息,需要使用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非常的簡單,就包括一個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類的代碼比較長,我們分解來看,MainActivity要實現(xiàn)LoaderCallbacks接口

class MainActivity : AppCompatActivity(), LoaderManager.LoaderCallbacks<Cursor> { 

使用Kotlin的伙伴對象,定義了靜態(tài)成員變量,LOADER_ID是Loader的ID,PHONE_PROJECTION是查詢通訊錄時希望查找的列集合

companion object {   private val LOADER_ID = 0   private val PHONE_PROJECTION = arrayOf(Phone._ID, Phone.DISPLAY_NAME, Phone.NUMBER) }

onCreate使用SimpleCursorAdapter作為ListView的Adapter,然后調(diào)用initLoader初始化了Loader

private var mAdapter:SimpleCursorAdapter? = nulloverride 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) } 

三個回調(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)建了一個CursorLoader,該Loader回執(zhí)行ContentProvider的操作,然后返回一個cursor;

onLoaderReset時,將Adapter中的cursor置null;

onLoadFinished時,由于CursorLoader查詢完數(shù)據(jù),會返回新的cursor,我們使用新的Cursor去替換之前Adapter中的cursor。

這樣,我們就可以在Activity啟動時自動異步加載數(shù)據(jù)了,手機上試試,可以發(fā)現(xiàn),加載非常順暢。github已上傳代碼。

以上這篇Android Loader的使用以及手機通訊錄的獲取方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 茂名市| 阳东县| 呼玛县| 阿克陶县| 胶州市| 兰州市| 河东区| 邹平县| 中山市| 八宿县| 黄冈市| 漳浦县| 迁西县| 南川市| 安义县| 玛纳斯县| 名山县| 邯郸县| 三门县| 防城港市| 和林格尔县| 西宁市| 资兴市| 布拖县| 彭山县| 象山县| 鲜城| 府谷县| 和静县| 田阳县| 福安市| 颍上县| 屏东市| 文成县| 霞浦县| 启东市| 五河县| 开平市| 龙南县| 武夷山市| 托克托县|