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

Android面试常客Handler详解

难度中级
时长 2小时 0分
学习人数
综合评分9.30
169人评价 查看评价
9.7 内容实用
9.3 简洁易懂
8.9 逻辑清晰
  • handler机制,是什么,怎么用,为什么用handler,android为什么要设计只能通过handler机制跟新ui呢?handler原理是什么,使用handler遇到问题,实现一个与县城相关的handler,handlerThread是什么,如何在主线程给予子线程发送消息。android中更新ui几种方式。非线程真的不能更新ui吗?
    查看全部
    8 采集 收起 来源:课程内容介绍

    2014-12-25

  • 在子线程中更新UI 1.当刚启动Activity即onCreate里面此时onResume方法还没有执行的时候可以,因为在线程中更新UI时会调用ViewParent.invalidateChild()方法检查当前的Thread是否是UIThread,若为UIThread则可以更新(ViewParent是一个接口类,其实现是ViewRootImpl;invalidateChild()方法调用checkThread()方法来检查线程是否为主线程)。ViewRootImp是在onResume方法中初始化的,所以只要在ViewRootImpl创建之前更新UI(在onCreate方法中创建线程并执行,此时还没有初始化ViewRootImp),就可以逃避掉checkThread()的检查进而更新UI。 2.-->刚启动的时候,立即在非UI线程更新->不报错(onResume还没有执行) --->休眠2s钟以后,更新——————>报错
    查看全部
  • 非UI线程能否更新UI --->刚启动的时候,立即在非UI线程更新->不报错。 --->休眠2s钟以后,更新——————>报错 更新UI-->会调用checkForRelayout()方法 -->invalidate()方法-->invalidate(true)方法,关注viewParent-->ViewRootImpl是ViewParent的实现类
    查看全部
  • handler总结:<br> 1.不能直接在非UI线程直接更新UI(大多数时候)。<br> 2.每次创建Handler时需要给它绑定一个looper,如果是主线程不给定具体的looper则会绑定默认的looper。<br> 3.子线程运行时一定要调用start()方法。<br> 4.在某些特殊情况下在非UI线程是可以更新UI的//不推荐使用(当刚启动Activity即onCreate里面此时onResume方法还没有执行的时候可以,因为在线程中更新UI时会调用ViewParent.invalidateChild()方法检查当前的Thread是否是UIThread,若为UIThread则可以更新(ViewParent是一个接口类,其实现是ViewRootImpl;invalidateChild()方法调用checkThread()方法来检查线程是否为主线程)。ViewRootImp是在onResume方法中初始化的,所以只要在ViewRootImpl创建之前更新UI(在onCreate方法中创建线程并执行,此时还没有初始化ViewRootImp),就可以逃避掉checkThread()的检查进而更新UI。)<br> 5.更新UI的四种方式:<br> a>使用handler.post方法<br> b>使用handler.sendMessage方法,用hanleMessage方法更新UI。<br> c>用runOnUiThread方法。<br> d>使用view.post方法。<br> 6.HnadlerThread本质是子线程,在创建子线程的handler时绑定的是handlerThread对象的getLooper()。
    查看全部
  • 为什么Handler需要和Looper关联,是因为Handler需要往Looper中的mQeueu里插入Message。所以,如果主线程需要和子线程之间通信,那有两个方法: 1. 主线程拥有子线程的Handler(注意:子线程的Handler需要关联自己的Looper),通过该Handler发送消息即可。 2. 主线程创建一个Handler,但是将子线程的Looper传递给Hander,这样Handler也是往子线程Looper对象的mQueue里插入msg,子线程Looper.loop自然可以拿到主线程消息了。 但是,这两种情况都有弊端。就是线程并发的时候,不能保证子线程的Handler或者Looper对象已经被初始化了。所以这个时候才需要用到HandlerThread
    查看全部
  • HandlerThread(对应ThirdActivity) 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的操作。
    查看全部
  • Handler大纲 1、Handler是什么? 2、Handler怎么用? 3、为什么使用Handler? 如果我们从网上下载图片显示到控件中如何实现,需要使用Handler来辅助 4、Android为什么要设计只能通过Handler机制更新UI? 5、Handler的原理是什么? 6、使用Handler时候遇到的问题 7、如何实现一个与现场相关的Handler 8、HandlerThread又是什么? 9、如何在主线程给子线程发送消息? 10、Android中更新UI的几种方式
    查看全部
    4 采集 收起 来源:课程内容介绍

    2015-01-18

  • 1. 子线程向主线程发送消息,必须有主线程的Handler,该Handler绑定了主线程的Looper。 2. 主线程向子线程发送消息,必须有子线程的Looper,为了防止Looper没有初始化,所以通过HandlerThread类,来保证子线程的Looper再被主线程调用时已经初始化。
    查看全部
  • 我解释一下主线程和子线程之间如何相互通信: 1. 子线程向主线程发送消息,必须有主线程的Handler,该Hnadler绑定了主线程的Looper。 2. 主线程向子线程发送消息,必须有子线程的Looper,为了防止Looper没有初始化,所以通过HandlerThread类,来保证子线程的Looper再被主线程调用时已经初始化。 我先写在这里,我觉得讲师的代码特别不好,很容易把初学者绕晕,我看了好久的Handler源码,都是暂定下来分析了代码才清楚的,因为代码原理是: 1. 子线程处理消息的过程中向主线程发送了消息。 2. 主线程处理消息的过程中又向子线程发送了消息。 消息直接循环起来了,我擦。
    查看全部
  • 为什么HandlerThread能够保证主线程调用自己的Looper对象不为null呢,是因为HandlerThread内部使用了wait()和notifyAll()的线程同步机制。
    查看全部
  • 我的关注点都在女的身上了,真的是风格迥异的三个女的。。。、
    查看全部
  • 创建一个与线程相关的Handler: 1. 在线程中通过Looper.prepare()方法创建一个与线程相关的Looper对象; 2. 在线程中通过Handler的new关键字,创建一个Handler对象,这个对象在创建的时候会关联上1中创建的Looper对象 3. 调用Looper对象的loop()方法去轮询它的MessageQueue 4. 通过其他的线程拿到这个线程的Handler对象之后调用sendMessage()之后,在这个线程中就可以进行Message的处理了。 我们一般是在主线程中创建Handler对象,在主线程中处理Message,在子线程中调用这个Handler对象的sendMessage()来发送message。所以Handler是在哪个线程创建就有哪个线程处理Message和轮询,而由别的线程负责给这个Handler发送Message。
    查看全部
  • Handler与Looper、MessageQueue的关系 1. Handler机制? 只要遵循Android使用handler来更新UI的机制,我们就不用关心多线程的问题,所有的更新UI的操作都是在主线程的消息队列中去轮询处理的。(如图) 2. Handler封装了消息的发送 (1)handler获取一个message handler.obtainMessage(); obtainMessage()的源码: public final Message obtainMessage() { return Message.obtain(this); //这里this本身就是handler对象 } Message.obtain()的源码: public static Message obtain(Handler h) { Message m = obtain(); m.target = h; //m.target就是Message的目的地,将handler本身赋给它,就说明目的地就是handler本身 return m; } 3. Looper (1)Looper作为一个消息封装的载体,包含了一个消息队列messageQueue,所有的Handler发送的消息都经过这个消息队列——要发送的消息会往这个消息队列中插入或移除。 (2)Looper.loop()方法是一个死循环,不断轮询messageQueue,如果有消息存在取出并发送给handler,然后handler处理消息,没有就阻塞 4. MessageQueue 一个消息队列,可以添加消息,并处理消息 5. Handler 内部会和Looper进行关联,也就是说在Handler内部可以找到Looper,找到了Looper也就找到了MessageQueue。调用handler.sendMessage()就是向消息队列中发送消息;然后Looper轮询MessageQueue,将message发送给Handler本身进行处理。 6. 总结: handler负责发送消息,Looper负责接收Hnandler发送的消息,并直接把消息回传给hanlder自己。MessageQueue是一个存储消息的容器。
    查看全部
  • 更新UI的4种方式(对应FifthActivity) 1.通过Handler的post()方法 mHandler.postDelayed(new Runnable() { public void run() { mTextView.setText("handler.post(Runnable)"); } }, 2000); 2.调用Handler.sendMessage()传统的方法 Message msg = new Message(); mHandler.sendMessageDelayed(msg, 2000); 配合handleMessage()使用。 3.重写Activity中的runOnUiThread()方法更新 runOnUiThread(new Runnable() { public void run() { mTextView.setText("runOnUiThread"); } }); 4.调用View自身的post(Runnable run)方法更新; mTextView.postDelayed(new Runnable() { public void run() { mTextView.setText("TextView.post()"); } }, 2000); 5. 以上四种更新UI的方式归根结底都是通过sendMessage()实现的。
    查看全部
  • 1. handler的设计缘由是考虑到多线程并发的问题,如果没有这种机制,可能会导致多线程下多个线程更新UI错乱的问题(没有枷锁),若加锁的话,则会影响性能。Handler通过消息队列,保证了消息处理的先后有序。
    查看全部
首页上一页1234567下一页尾页

举报

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

微信扫码,参与3人拼团

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

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