自定义Loader步骤:
1.创建一个类继承AsyncTaskLoader
参数是个泛型:是加载结果。
2.重写方法
a) loadInBackground():是要求必须重写的方法,运行在非UI线程中,所以在这里加载数据。
b) onStartLoading():是可选的方法,但是一般写上,在这里调用forceLoad()强制开启后台任务使loadInBackground()开始执行
c) onStopLoading():是可选的方法,但是一般写上,在这里调用cancelLoad()强制关闭后台任务使loadInBackground()结束执行(onStopLoading()是程序退出后执行并不是数据加载完成)。
使用自定义Loader步骤:
1.该类必须继承LoaderCallbacks
2.实例化Loader对象
getLoaderManager().initLoader(1, null,this)
参数1:要实例化的loader的id,可能有多个loader,所以用id标示,这个id随便写,只要是整数
参数2:传值,放的是bundle的带来的值
参数3:LoaderCallBack接口,即刚才继承LoaderCallbacks的,所以就可以写this
2.重写三个方法
//实例化Loader @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { //使用自定义的Loader //onCreateLoader()方法中直接返回自定义Loader对象
return new MyLoader(MainActivity.this, args); } //数据加载完成--->参数2:新数据 @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { //把adapter中的数据,替换为最新的数据 adapter.swapCursor(data); } //重置,而不是重启!!!! @Override public void onLoaderReset(Loader<Cursor> loader) { //释放数据 adapter.swapCursor(null); } |
SearchVIew的使用:
添加SearchVIew到ActionBar:
1.在menu文件夹下xml文件中:对item添加属性:actionViewClass-->要添加的视图的完整类名
2.修改属性:showAsAction:always
<item android:id="@+id/item01" android:orderInCategory="1" android:showAsAction="always" android:actionViewClass="android.widget.SearchView"/> |
//填充菜单 getMenuInflater().inflate(R.menu.main, menu); //获取到item01中的SearchView---》actionViewClass SearchView sv=(SearchView) menu.getItem(0).getActionView(); |
二、获取ActionView:
在onCraeteOptionsMenu()中
menu.getItem(index).getActionView()--->SearchView
Handler的使用:
Handler是线程之间通信的桥梁,有一个接收、处理消息的方法:handleMessage(Message)-->参数就是发过来的消息对象
Message消息对象:携带数据--》四个属性
Arg1、arg2:携带int值
Obj:携带一个对象---》Object
What:int,用来识别Message
发消息:
SendMessage(Message)
sendMessageAtTime(Message msg, long uptimeMillis)
sendMessageDelayed(Message msg, long delayMillis)
当没有数据时可以使用空的发送,空发送并不是发送空的数据,而是系统会自动加上数据。
handler.sendEmptyMessage(what);
sendEmptyMessageAtTime(Message msg, long uptimeMillis)
sendEmptyMessageDelayed(Message msg, long delayMillis)
获取一个Message对象--》把传进来的what值放在了msg对象的what上
sendMessageDelayed() :即时发送
handler.sendEmptyMessageAtTime() :定时发送
参数2:开机到现在毫秒数-基础上加值(SystemClock.uptimeMillis()+3000)获得开机时间到现在多久。
handler.sendEmptyMessageDelayed(3, 3000) :延迟发送
参数二:直接就是延迟多少毫秒发送
Handler.post()
handler.postAtTime()
handler.postDelayed()
Message对象的获取:
1.obtainMessage()---》Handler
2.通过构造方法Message()
3.Obtain()--->Message
Handler、Message、MessageQueue、Looper之间的关系:
Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。
Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。
MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的抽取。
Looper:消息泵,不断地从MessageQueue中抽取Message执行。因此,一个MessageQueue需要一个Looper。
Thread:线程,负责调度整个消息循环,即消息循环的执行场所。
不太明白,百度一下。
每一个线程只能有一个Looper对象
Handler持有一个Looper
Handler、Looper持有一个MessageQueue
Looper的loop方法有一个死循环:
循环地从消息队列中取消息,阻塞式操作
Message持有一个Handler对象
Msg把自己送给Handler进行处理
Msg被放进全局池中
Handler.obtainMessage():
调用Message.obtain()-->去池中出去可用的msg、如果没有的话new 一个
Handler.sendMessage()-->把消息放进消息队列
Handler.post(Runnable)调用sendMessage...():
--》得msg对象---》把Runnable对象放在了msg的callback上
处理的时候---》msg.callback.run()