Android学习笔记——自定义Loader

自定义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()

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值