Handler的使用(一)

概念:

MessageQueue:消息队列,存放消息的地方,按照FIFO(先进先出)规则执行,每一个线程只可以拥有一个MessageQueue,在创建looper对象会创建一个MessageQueue对象

Message:消息对象,MessageQueue中存放的对象,一个MessageQueue中可以包含多个Message对象,可以通过Message.obtain()或Message.obtainMessage()获取Message对象,但是并不一定是直接创建一个新的实例,而是先从消息池中看有没有可用的Message实例,存在则直接取出返回这个实例,如果消息池中没有可用的Message实例,则才用给定的参数创建一个Message对象,调用removeMessage()将message对象从MessageQueue中删除,同时放入到消息池中

Looper:操作MessageQueue.一个Looper对应一个MessageQueue.通过调用Loop.myLooper()可以获得当前线程的Looper对象.Looper从MessageQueue中取出Message后,交给Handler的handleMessage()进行处理.处理完后,调用Message.recycle()将其放入消息池中

Handler:消息的处理者,handler负责将需要传递的信息封转成Message对象,然后调用sendMessage()方法将消息放入到MessageQueue中,当MessageQueue循环到该Message,

调用相应的Handler对象的HandleMessage()方法对其进行处理,Handler都可以共享同一个Looper和MessageQueue

handler类允许你发送消息和处理线程消息队列中的消息及runnable对象。handler实例都是与一个线程和该线程的消息队列一起使用,一旦创建了一个新的handler实例,系统就把该实例与一个线程和该线程的消息队列捆绑起来,这将可以发送消息和runnable对象给该消息队列,并在消息队列出口处处理它们。

handler类有两种主要用途:1。按照时间计划,在未来某时刻,对处理一个消息或执行某个runnable实例。2。把一个对另外线程对象的操作请求放入消息队列中,从而避免线程间冲突。

时间类消息通过如下方法使用: post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), and sendMessageDelayed(Message, long)
methods. post之类函数可以传输一个runnable对象给消息队列,并在到达消息队列后被调用。sendmessage之类函数可以传送一个包含数据的message对象,该message对象可以被Handler类的handleMessage(Message) 方法所处理。

post之类函数和sendmessage之类的函数都可以指定消息的执行时机,是立即执行、稍后一段时间执行,还是在某个确定时刻执行。这可以用来实现超时、消息或其他时间相关的操作。

当一个进程启动时,主线程独立执行一个消息队列,该队列管理着应用顶层的对象(如:activities、broadcast receivers等等)和所有创建的窗口。你可以创建自己的一个线程,并通过handler来与主线程进行通信。这可以通过在新的线程中调用主线程的handler的post和sendmessage操作来实现。

1、布局文件main.xml

  1. <ProgressBar
  2. android:id="@+id/myProBar"
  3. style="?android:attr/progressBarStyleHorizontal"
  4. android:layout_width="fill_parent"
  5. android:layout_height="wrap_content"
  6. android:visibility="gone"/>//将ProgressBar设置为不可见
  7. <Button
  8. android:id="@+id/btnStart"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:text="@string/btnStart"/>

2、Activity文件中的代码如下

  1. //声明控件变量
  2. ProgressBarproBar;
  3. ButtonbtnStart;
  4. inti=0;
  5. @Override
  6. publicvoidonCreate(BundlesavedInstanceState){
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.main);
  9. //根据控件的ID得到控件的对象
  10. roBar=(ProgressBar)this.findViewById(R.id.myProBar);
  11. btnStart=(Button)this.findViewById(R.id.btnStart);
  12. //为btnStart按钮绑定监听器
  13. btnStart.setOnClickListener(newView.OnClickListener(){
  14. @Override
  15. publicvoidonClick(Viewarg0){
  16. proBar.setVisibility(View.VISIBLE);
  17. updateBarHandler.post(updateThread);
  18. }
  19. //使用匿名内部类来复写Handle当中的handlerMessage()方法
  20. HandlerupdateBarHandler=newHandler(){
  21. @Override
  22. publicvoidhandlerMessage(Messagemsg){
  23. //将进度条设置为可见
  24. proBar.setProgress(msg.arg1);
  25. //调用Handler的post()方法,将要执行的线程对象添加到队列当中
  26. updateBarHandler.post(updateThread);
  27. }
  28. };
  29. //线程类,该类使用匿名内部类的方式进行声明
  30. RunnableupdateThread=newRunnable()
  31. {
  32. //将要执行的操作写在线程对象的run()方法当中
  33. @Override
  34. publicvoidrun(){
  35. i+=10;
  36. //得到一个消息,Message类是由android操作系统提供
  37. Messagemsg=updateBarHandler.obtainMessage();
  38. //可以用arg1和arg2这两个成员变量传递消息
  39. msg.arg1=i;
  40. try{
  41. //睡眠1秒
  42. Thread.sleep(1000);
  43. }
  44. catch(InterruptedExceptione){
  45. e.printStackTrace();
  46. }
  47. //将msg对象加入到消息队列当中(加入到消息队列中就立刻返回,不管消息是否被处理(异步),会调用handleMessage()方法)
  48. updateBarHandler.sendMessage(msg);
  49. if(i==100)
  50. {
  51. //将线程对象从队列中移除
  52. updateBarHandler.removeCallbacks(updateThread);
  53. }
  54. }
  55. };
  56. });
  57. }

3、运行结果

Handler的使用(一)

1.Handler与线程

实际上Handler与Activity处于同一线程当中

  1. publicvoidonCreate(BundlesavedInstanceState){
  2. super.onCreate(savedInstanceState);
  3. Handlerhandler=newHandler();
  4. handler.post(r);
  5. setContentView(R.layout.main);
  6. System.out.println("activity--->"+Thread.currentThread().getId());
  7. System.out.println("activity--->"+Thread.currentThread().getName());
  8. }
  9. Runnabler=newRunnable(){
  10. @Override
  11. publicvoidrun(){
  12. System.out.println("handler--->"+Thread.currentThread().getId());
  13. System.out.println("handlerName--->"+Thread.currentThread().getName());
  14. try{
  15. Thread.sleep(10000);
  16. }catch(InterruptedExceptione){
  17. e.printStackTrace();
  18. }
  19. }

handersetCotentView()之前,所有要等待10秒,Activity中的内容才显示处理,并且输出的id和name相同,则说明Handler没有启动新线程,

2.在新线程当中处理消息方法,(需要使用Looper对象,改对象提供了循环的从队列中取消息的这种功能),并使用Bundle

  1. packagewei.cao.handler;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.os.Handler;
  5. importandroid.os.HandlerThread;
  6. importandroid.os.Looper;
  7. importandroid.os.Message;
  8. publicclassHandler_03extendsActivity{
  9. @Override
  10. protectedvoidonCreate(BundlesavedInstanceState){
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.main);
  13. System.out.println("Activity--->"+Thread.currentThread().getId());
  14. //生成一个HandlerThread对象,实现了使用looper来处理消息的功能,这个类由Android应用程序框架提供
  15. HandlerThreadhandlerThread=newHandlerThread("handler_thread");
  16. //在使用HandlerThread的getLooper()方法之前,必须先调用该类的start()方法,否在调用getLooper()方法返回null
  17. handlerThread.start();
  18. MyHandlermyHandler=newMyHandler(handlerThread.getLooper());
  19. //将Msg发送到目标对象,所谓的目标对象,就是生成msg对象的hand对象
  20. Messagemsg=myHandler.obtainMessage();
  21. //使用Bundler对象来传递数据
  22. Bundleb=newBundle();
  23. b.putString("name","wei_cao");
  24. b.putInt("age",10);
  25. msg.obj="abc";
  26. msg.setData(b);
  27. msg.sendToTarget();
  28. }
  29. classMyHandlerextendsHandler
  30. {
  31. publicMyHandler(Looperlooper)
  32. {
  33. super(looper);
  34. }
  35. @Override
  36. publicvoidhandleMessage(Messagemsg){
  37. Stringstr=(String)msg.obj;
  38. //从消息中取出Bundle对象
  39. Bundleb=msg.getData();
  40. Stringname=b.getString("name");
  41. intage=b.getInt("age");
  42. System.out.println("nameis"+name+"ageis"+age+"stris"+str);
  43. System.out.println("Handler--->"+Thread.currentThread().getId());
  44. System.out.println("handleMessage");
  45. }
  46. }
  47. }

你可能感兴趣的:(handler)