为了账号安全,请及时绑定邮箱和手机立即绑定

Android面试常客Handler详解

难度中级
时长 2小时 0分
学习人数
综合评分9.30
169人评价 查看评价
9.7 内容实用
9.3 简洁易懂
8.9 逻辑清晰
  • handler原理
    查看全部
  • handler机制原因
    查看全部
  • Handler与Looper和MessageQueue的关系
    查看全部
  • handler中常见的两种报错
    查看全部
  • handler
    查看全部
  • 带Callback参数的Handler可以截获消息,true则拦截,false则不拦截
    查看全部
  • 面试用:在非主线程是否可以更新UI 答:当刚启动还没有onResume的时候可以,即onCreate里面 ViewRootImp是在onResume方法中初始化的,在onCreate方法中创建线程并执行,此时还没有初始化ViewRootImp
    查看全部
  • 更新ui的四种方法: 第一种: private void handle1(){ handler.post(new Runnbale(){ public void run(){ textView.setText("ok"); } }); } 第二种:直接在子线程中使用sendMessage,在创建handler对象的时候,在其中的handleMessage方法中去更新ui private void handler2(){ handler.sendEmptyMessage(1); } 第三种: private void handler3(){ runOnUiThread(new Runnable(){ public void run(){ textView.setText("ok"); } }) } 第四种: private void viewUi(){ textView.post(new Runnable(){ public void run(){ textView.setText("ok"); } }) }
    查看全部
  • 1.创建主线程的handler,并向子线程发送消息: //主线程的handler Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { Message message = new Message(); threadHandler.sendMessageDelayed(message, 1000);//向子线程发送消息 }; }; 2.创建子线程的handler,向主线程发送消息,要关联一个threadHandler,threadHandler.getLooper()得到一个looper对象 HandlerThread handlerThread = new HandlerThread("handler thread"); handlerThread.start();//不要忘记调用start方法! //子线程的handler threadHandler = new Handler(handlerThread.getLooper()){ @Override public void handleMessage(Message msg) {//处理消息 Message message = new Message(); handler.sendMessageDelayed(message, 1000); } };
    查看全部
  • HandlerThread 1. Handler在创建的时候可以指定Looper,这样通过Handler的sendMessage()方法发送出去的消息就会添加到指定Looper里面的MessageQueue里面去。在不指定Looper的情况下,Handler绑定的是创建它的线程的Looper。 如果这个线程的Looper不存在,程序将抛出"Can't create handler inside thread that has not called Looper.prepare()"。 2. HandlerThread继承于Thread,所以它本质就是个Thread。与普通Thread的差别就在于,它有个Looper成员变量。 在其run()方法中,调用Looper.myLooper()获得一个looper对象。 synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); 在创建handler时使用getLooper()方法,其实现其实是一直等待looper对象的获得。 while (isAlive() && mLooper == null) { try { wait(); } } 3. HandlerThread的用处 创建Handler的时指定的looper,可以是别的线程创建的。所以Handler中MessageQueue的轮询不一定非要是创建Handler的线程进行,还可以在别的线程中进行。 这个时候我们就需要使用HandlerThread这个类来创建这个Looper了,这样消息的处理就在新创建的HandlerThread中进行。 mThread = new HandlerThread("Handler Thread"); mHandler = new Handler(mThread.getLooper()){ public void handleMessage(android.os.Message msg) {... }; }; 同样需要注意:在新创建的ThreadThread中不能有更新UI的操作。
    查看全部
  • public class MyThread extends Thread { /** * 与子线程相关的Handler */ public Handler handler; @Override public void run() { Looper.prepare();//消息队列准备 handler = new Handler(){ @Override public void handleMessage(Message msg) { System.out.println("currentThread:" + Thread.currentThread()); } }; Looper.loop();//循环处理消息 } }
    查看全部
  • Message:消息,其中包含了消息ID,消息处理对象以及处理的数据,由MessageQueue同意列队,终由Handle处理 Handle:处理者,负责Message的接受和处理,使用Handle时,需要实现handleMessage(Message msg)方法对特定的Message进行处理,例如对UI更新等。 MessageQueue:消息队列,用来存放Handle发送过来的消息,并按照FIFO规则执行,当然,存放Message并非实际意义的保存,而是将Message以链表的方法串联起来的,等待Looper的抽取 Looper:消息泵。不断地从MessageQueue中抽取Message执行,因此,一个MessageQueue需要一个Looper。 Thread:线程,负责调整整个消息循环,及消息循环的执行场所
    查看全部
  • 1、handler 消息处理器,负责处理消息。 2、Message 消息,包含消息id,被处理的对象。 3、MessageQueue 消息队列,存放Handler发送过来的Message 4、looper 消息泵,不间断的从MessageQueue消息队列中抽取消息。 简单的比喻looper就是水泵,MessageQueue储水的池塘,Message就是水,Handler就是操作的人
    查看全部
  • handler.removeCallBack(runnable) 可以移除一个已经挂接执行的方法 Handler handler=new Handler(new Callback(){里面也有个boolean handleMessage 返回true时可以截获发送到handler的message}){@Override void handleMessage()}
    查看全部
  • 通过 handler来实现sendMessage的方法的步骤: 1.创建一个handler的对象,并在其中重写handlerMessage的方法,并在其中更新ui private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { textView.setText("" + msg.arg1);};}; 2.创建一个Thread类,在其中的run()方法中初始化一个message,并为message来赋值,并调用handler的sendMessage的方法 new Thread() { public void run() { try { Thread.sleep(2000); Message message = new Message(); message.arg1 = 88; handler.sendMessage(message); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }; 这样,执行这个线程的时候就会通过sendMessage的方法将message参数传递过去,并在上面的初始化handler的时候接受到参数,并实现更新ui Message message=handler.obtainMessage()得到系统消息(自动定位到handler就不用handler.sendMessage())或者Message message=new Message() handler发送的消息 handler.sendMessage(message) message.sendToTarget()对于已经绑定好handler的message
    查看全部

举报

0/150
提交
取消
老师告诉你能学到什么?
通过本课程,你将学到: 1、什么是Handler 2、如何使用Handler 3、Handler的原理是什么 4、如何定义一个与线程相关的Handler 5、Android更新UI的几种方式 6、非UI线程真的不能更新UI吗 7、Handler使用过程中遇到的问题

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!