91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-10-09 12:13:53 來源:腳本之家 閱讀:122 作者:大鵬1987 欄目:移動開發

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

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

Loader的唯一標識符ID,用來區分多個Loader;

傳遞給Loader的參數,可選;

Loader的回調。

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

Loader的回調接口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創建時被調用;

onLoadFinished在Loader加載數據完成時調用;

onLoaderReset在Loader被reset時被調用。

Loader接口就這些,我們通過一個實際的應用案例看看怎么使用Loader,這里選擇了手機通信錄的獲取,獲取手機的通信錄信息,需要使用Phone的ContentProvider,下面例子中詳細來看。

由于要訪問通信錄,需要在manifest文件添加權限:

<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要實現LoaderCallbacks接口

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

使用Kotlin的伙伴對象,定義了靜態成員變量,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,然后調用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) 
} 

三個回調方法:

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

onLoaderReset時,將Adapter中的cursor置null;

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

這樣,我們就可以在Activity啟動時自動異步加載數據了,手機上試試,可以發現,加載非常順暢。github已上傳代碼。

以上這篇Android Loader的使用以及手機通訊錄的獲取方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

社会| 葫芦岛市| 桂平市| 广南县| 霞浦县| 塔城市| 南溪县| 和龙市| 宁城县| 临武县| 武安市| 襄樊市| 玛沁县| 长汀县| 丰都县| 赞皇县| 太仓市| 枣阳市| 民县| 平顶山市| 武威市| 昌江| 成安县| 西和县| 阿克陶县| 志丹县| 噶尔县| 镇安县| 东明县| 祁连县| 岳阳县| 闻喜县| 澜沧| 冷水江市| 克山县| 得荣县| 南汇区| 防城港市| 准格尔旗| 塔城市| 静海县|