Android Loader的使用以及手機通訊錄的獲取方法
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? = 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) }
三個回調(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)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android studio實現(xiàn)滑動開關(guān)
這篇文章主要為大家詳細(xì)介紹了Android studio實現(xiàn)滑動開關(guān),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-03-03Android 網(wǎng)絡(luò)圖片查看顯示的實現(xiàn)方法
本篇文章小編為大家介紹,Android 網(wǎng)絡(luò)圖片查看顯示的實現(xiàn)方法,需要的朋友參考下2013-04-04Android上傳多張圖片的實例代碼(RxJava異步分發(fā))
本篇文章主要介紹了Android上傳多張圖片的實例代碼(RxJava異步分發(fā)),具有一定的參考價值,有興趣的可以了解一下2017-08-08Android 異步任務(wù) 設(shè)置 超時使用handler更新通知功能
這篇文章主要介紹了Android 異步任務(wù) 設(shè)置 超時使用handler更新通知,文中給大家提到了使用AsyncTask設(shè)置請求超時的注意事項 ,需要的朋友可以參考下2017-12-12Android編程使用Service實現(xiàn)Notification定時發(fā)送功能示例
這篇文章主要介紹了Android編程使用Service實現(xiàn)Notification定時發(fā)送功能,涉及Android服務(wù)Service控制通知的發(fā)送功能相關(guān)操作技巧,需要的朋友可以參考下2017-08-08