目录
- 简介
- 接口方法
- Loader的一些相关接口
- 实例
简介
参考网址:http://www.cnblogs.com/jisheng/archive/2013/01/09/2852553.html
https://blog.youkuaiyun.com/axi295309066/article/details/52536960
Loader有什么作用,能实现什么功能
Loader有什么作用?
提供异步加载数据机制, 能对数据进行数据变化的监听 实时更新数据,
可以在任何的Activity和Fragment中使用, 在Activity配置发生变化(如横竖屏切换)时不用重复加载数据;
. Loader能实现什么功能?
举个例子:如果你要实现实时读取服务器中某个文件中的数据的话,常规的操作是不是必须得隔一段时间就得去服务器中查询一下,看看是否有更新后的数据。
但是如果你使用Loader之后你就可以不要再这样麻烦的去操作了,Loader提供的一个机制可以自动检测文件数据的变化并实时的更新你的UI界面。
LoaderCallBack的接口方法
onCreateLoader()
创建一个Loader,并把一些查询结果返回给onLoadFinished中
onLoadFinished()
异步操作加载完成后加载的方法,主要写一些UI的操作
onLoaderReset()
按Back键返回或者退出程序会调用到它,主要是释放一些资源
相关接口
实例
在这里我使用的是获取服务器中的txt文本读取里面的数据,并显示在Listview中,==需要注意的一点是如果是读取数据库或者电话本的时候你获取的ID必须是_id
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
//加载数据
var ojbData = arrayListOf<User>()
thread {
jsnstring = URL("http://10.0.2.2:3434/test.txt").readText(charset("GB2312")).split("\n")
jsnstring.forEach {
var temp = it.split(",")
ojbData.add(User(temp[0], temp[1]))
}
}
adapter = MyAdapter(ojbData)
listview = Second_ListView
listview.adapter = adapter
//装载器管理-->初始化数据 观察者模式
//第一个参数是ID,它根据ID去加载器管理中寻找是否有这个ID的Loader
//第二个参数是在构造时提供给加载器中的可选参数---->直接传递到onCreateLoader方法中的第二个参数
loaderManager.initLoader(0, null, MyLoader())
}
//可以支持在Activity和Fragment里面使用
inner class MyLoader : LoaderManager.LoaderCallbacks<ArrayList<User>> {
override fun onCreateLoader(p0: Int, p1: Bundle?): Loader<ArrayList<User>> {
//创建异步查询任务
return Second_AsyncTask(this@Second)
}
//按Back键或者退出程序时使用的方法
//将加载器中的数据重置为空
override fun onLoaderReset(p0: Loader<ArrayList<User>>?) {
adapter = MyAdapter(null)
}
//onCreateLoader--->会把数据传入到该方法中 第二个参数就是具体查询出来的值
//在里面写一些更新UI的操作
override fun onLoadFinished(p0: Loader<ArrayList<User>>?, p1: ArrayList<User>?) {
adapter = MyAdapter(p1?.toList() as ArrayList<User>)
listview.adapter = adapter
//重新启动Loader--->直接将之前ID为P0的Loader的数据丢弃掉 重新创建一个新的Loader
loaderManager.restartLoader(0, null, this)
}
}
}
//AsyncTaskLoader:异步任务加载
//异步操作
class Second_AsyncTask(context: Context) : AsyncTaskLoader<ArrayList<User>>(context) {
//子线程:主要写一些获取数据的操作
override fun loadInBackground(): ArrayList<User> {
var jsnstring = URL("http://10.0.2.2:3434/test.txt").readText(charset("GB2312")).split("\n")
var ojbData = arrayListOf<User>()
jsnstring.forEach {
var temp = it.split(",")
ojbData.add(User(temp[0], temp[1]))
}
return ojbData
}
override fun onStartLoading() {
super.onStartLoading()
//强制运行
forceLoad()
}
}