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 {

Loader onCreateLoader(int var1, Bundle var2);

void onLoadFinished(Loader var1, D var2);

void onLoaderReset(Loader var1);

}

onCreateLoader在Loader创建时被调用;

onLoadFinished在Loader加载数据完成时调用;

onLoaderReset在Loader被reset时被调用。

Loader接口就这些,我们通过一个实际的应用案例看看怎么使用Loader,这里选择了手机通信录的获取,获取手机的通信录信息,需要使用Phone的ContentProvider,下面例子中详细来看。

由于要访问通信录,需要在manifest文件添加权限:

activity_main.xml非常的简单,就包括一个ListView,用来显示通讯录列表。

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="com.example.yjp.contractgetter.MainActivity">

android:id="@+id/listView"

android:layout_width="match_parent"

android:layout_height="match_parent" />

MainActivity类的代码比较长,我们分解来看,MainActivity要实现LoaderCallbacks接口

class MainActivity : AppCompatActivity(), LoaderManager.LoaderCallbacks {

使用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 {

return CursorLoader(this,

Phone.CONTENT_URI,

PHONE_PROJECTION,

null,

null,

Phone.DISPLAY_NAME)

}

override fun onLoaderReset(cursor: Loader?) {

mAdapter?.swapCursor(null)

}

override fun onLoadFinished(loader: Loader?, cursor: Cursor?) {

mAdapter?.swapCursor(cursor)

}

onCreateLoader创建了一个CursorLoader,该Loader回执行ContentProvider的操作,然后返回一个cursor;

onLoaderReset时,将Adapter中的cursor置null;

onLoadFinished时,由于CursorLoader查询完数据,会返回新的cursor,我们使用新的Cursor去替换之前Adapter中的cursor。

这样,我们就可以在Activity启动时自动异步加载数据了,手机上试试,可以发现,加载非常顺畅。

以上这篇Android Loader的使用以及手机通讯录的获取方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

android的kotlin通讯录,Android Loader的使用以及手机通讯录的获取方法相关推荐

  1. android手机如何到导出电话号码,苹果手机通讯录怎么导入?如何导出手机通讯录到新手机...

    苹果手机通讯录怎么导入?如何导出手机通讯录到新手机?手机通讯录是我们与外界连接的纽带,有了一个电话号码才能够打电脑,这是每一个小伙伴都知道的.在日新月异的手机更替中,换手机已经成为一个非常稀松平常的事 ...

  2. [Android]使用Kotlin开发Android(二)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4829007.html [TOC] 使用Kotlin+OkHtt ...

  3. android手机号码恢复,手把手教你如何恢复安卓手机通讯录里面丢失的数据

    原标题:手把手教你如何恢复安卓手机通讯录里面丢失的数据 虽然现在的智能手机有非常多的功能,但是通话仍然是手机里面最为重要也最为常用的功能,通讯录也是十分重要的,他存放着我们手机内所有联系人的手机号.那 ...

  4. android ios 微信 备份通讯录备份,苹果手机微信怎么备份手机通讯录?手机通讯录怎么备份...

    苹果手机微信怎么备份手机通讯录?手机通讯录怎么备份?要知道通讯录数据可是一份非常重要的数据,如果它丢失的话可能会造成很多的麻烦,毕竟很多的电话号码要是丢失又很难再找来,所以就需要去知道如何找回丢失的重 ...

  5. 华为手机备份的通讯录是什么文件_华为手机通讯录在哪个文件夹?怎么恢复华为手机通讯录...

    华为手机通讯录在哪个文件夹?怎么恢复华为手机通讯录?手机通讯录丢失了应该如何恢复,手机丢失了通讯录联系人应该如何恢复呢?许多时候因为各种各样的原因我们会丢失手机重要的通讯录联系人,对于现在这个时刻追求 ...

  6. python 通讯录系统_Python基础项目:手机通讯录系统

    完成简易手机通讯录管理系统,包括以下功能: 能够循环接收客户端输入的功能编号,并根据编号选择对应的功能操作 用户输入"1"时,执行增加姓名和手机号码的操作 用户输入"2& ...

  7. Android 电视 文件目录,通用的安卓智能电视截屏及图片目录文件获取方法

    截屏终于成功了,简单得不能再简单了,再也不用"炫"烂的不行的拍摄技术了,拍得太烂严重影响申精华.发图的情绪,严重打击自信心.虽然很简单,但真是好用的干货,图片美美的,原始的图片就是 ...

  8. 华为手机备份的通讯录是什么文件_华为手机通讯录如何备份?

    展开全部 华为手机中自带有备份的功能,可32313133353236313431303231363533e78988e69d8331333366303139以对系统数据进行备份,可用于备份图片.联系人 ...

  9. 华为手机备份的通讯录是什么文件_华为手机通讯录在哪个文件夹?

    2014-04-07 华为手机不断自动重启咋么办 刷机教程 1.手机关机,按上下音量键+HOME键+开机键,等待进入Recovery 2.用音量键选择wipe data/factorg reset,选 ...

最新文章

  1. Facebook推出VR版远程办公应用,白板共享、手势/键盘追踪等技能解锁沉浸式开会体验...
  2. (转)一个带自定义分页,排序功能的DATAGRID控件(公开源码)
  3. 关于数据库隔离问题说明及解决
  4. mysql+encode+decode+错误_mysql decode encode 乱码问题
  5. WindowsServer2012史记5-简洁,管理更多的服务器
  6. 基金大跌,基民上闲鱼“卖货回血”了!支付宝深夜发文!真的没人买基了?...
  7. 哪个中年IT男不是一边面对危机,一边咬牙硬抗【转】
  8. Java项目权威排名:Nacos未上版,gradle排名第二,Maven排名28
  9. 【小贴士】工作中的”闭包“与事件委托的”阻止冒泡“
  10. JQuery iframe页面通过parent方法操作父页面中的元素与方法(实例讲解)
  11. CCF推荐期刊/会议历年发表论文数据库:CCF Rec-Paper DB
  12. mysql随机生成中文姓名_编写mysql函数 随机生成中文姓名
  13. firefox图片不存在就显示小红叉的方法
  14. 游戏服务器设计(C#)简单版
  15. 父类与子类的执行顺序
  16. Android 之BlockingQueue
  17. MIDI应用: 播放midi音乐文件的方法 [Win32版本+ C语言版本]
  18. JS 函数中的 arguments 类数组对象
  19. 秀场精灵陈梓桐 受邀担任第六季完美童模全球总决赛首席体验官
  20. Node - fs(文件系统)

热门文章

  1. Oracle PGA内存管理 PGA Memory Management
  2. 塞上卧龙图:白酒,只需饮,无需多问
  3. python网站设计开题报告_(完整word版)网站设计开题报告
  4. 华为鸿蒙的科技话题作文800字,科技的发展作文800字4篇
  5. Artisteer 和 框架——選擇哪一個?
  6. linux 安装极点五笔
  7. 标定数据分析-DCM(.DCM)
  8. 【基础恶补】JavaScript数组的一些方法,reduce,filter,reverse,map等
  9. 各种常见文件的文件头及其含义
  10. vostro3470装win7_戴尔(dell)成就3470台式机装win7系统及bios设置(支持