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

Android面试常客Handler详解

难度中级
时长 2小时 0分
学习人数
综合评分9.30
169人评价 查看评价
9.7 内容实用
9.3 简洁易懂
8.9 逻辑清晰
  • handler-4
    查看全部
  • handler-3
    查看全部
  • handler_2
    查看全部
    0 采集 收起 来源:Handler是什么

    2017-03-06

  • handler_1
    查看全部
    0 采集 收起 来源:Handler是什么

    2017-03-06

  • handler_1
    查看全部
    0 采集 收起 来源:课程内容介绍

    2017-03-06

  • handler是用来发送和处理消息的,更新UI的
    查看全部
  • handler 消息处理机制 更新UI界面
    查看全部
    0 采集 收起 来源:Handler是什么

    2017-03-01

  • 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。)
    查看全部
  • 所有更新UI的操作,都要使用view的invalidate方法 settext方法中也使用了invalidate方法 invalidate(true) 判断UI线程 invalidateChild(this,null)中调用invalidateChildInParent方法 中使用checkThread,检查当前更新UI的操作是否在主线程之中 在Onresume方法中创建viewrootmp oncreate方法在onresume方法之前,所以在oncreate方法中没有检测子线程是否与UI线程相等
    查看全部
  • Android中更新UI的几种方式: 1. activity.runOnUiThread() 2. handler.post() 3. handler.sendMessage() 4. view.post()
    查看全部
  • 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 注意的地方 创建handler对象 指定Looper 在MyThread 的Looper对象 空指针异常 多线程并发 两个线程可能Looper没有创建 HandlerThread可以避免空指针问题 handlerThread对象 handler对象 thread.getLooper 原理判断线程是否或者 空则等待 run方法创建 Looper通知加线程同步的判断 默认所有的handlerThread中下载网络资源 把所有的任务的发送处理 调用handlerThread
    查看全部
  • 自定义Thread MyThread extend Thead 调用 Looper.prepare 与子线程相关的handler handler和子线程关联 thread.sendMessage 如果在主线程中创建一个handler,并重写handlemessage方法,那么一定不要在这里执行耗时操作,这样有可能会将主线程卡死 创建一个与线程相关的Handler: 1. 在线程中通过Looper.prepare()方法创建一个与线程相关的Looper对象; 2. 在线程中通过Handler的new关键字,创建一个Handler对象,这个对象在创建的时候会关联上1中创建的Looper对象 3. 调用Looper对象的loop()方法去轮询它的MessageQueue 4. 通过其他的线程拿到这个线程的Handler对象之后调用sendMessage()之后,在这个线程中就可以进行Message的处理了。<br> <br> 我们一般是在主线程中创建Handler对象,在主线程中处理Message,在子线程中调用这个Handler对象的sendMessage()来发送message。所以Handler是在哪个线程创建就有哪个线程处理Message和轮询,而由别的线程负责给这个Handler发送Message。 * 每个线程都对应一个looper,在线程里面创建的handler默认都会与这个looper对应 * 一个线程可以有多个handler与唯一的一个looper对应,有且只有一个looper * 这里主要是让我们熟悉在oncreat创建的handler与子线程创建handler * oncreate创建的handler他默认里面会有一个looper与之对应 * 所以我们自己在子线程中创建handler对象的时候我们应该要自主创建一个looper
    查看全部
  • 使用“Message”方式“发送消息”,使“Handler处理消息,并更新UI” 1.定义Handler,并且实例化,使用默认构造函数即可。 2.重写handlerMessage方法。 private Handler msgHandler=new Handler(){ //定义handler,重写处理message方法。当该handler发送消息的时候,这个方法会被执行。 public void handleMessage(android.os.Message msg) { //msg为当有sendMessage方法调用时,传过来的Message对象。 mTextView.setText("msg:"+msg.arg1); }; }; 3.定义Message对象。其中,Message提供了三个公共变量。arg1,arg2,obj,可以将消息放入其中,作为消息信息。然后发送消息即可 new Thread() { public void run() { Message message=msgHandler.obtainMessage();//从Handler对象中获取Message对象,而不是自己new,这样效率高。 message.arg1=1; message.sendToTarget(); //对于从handler对象中获取的message,可以直接使用该方法发送消息。 //msgHandler.sendMessage(message); //发送消息 }; }.start(); 知识拓展: 1。实例化Handler时,可以使用带一个Callback接口参数的构造函数。 其中Callback有一个未实现的方法。 这个方法有一个返回值(boolean) 2.当该Handler收到消息时,首先会调用Callback中的消息处理方法。 2.1 如果返回值为false,消息不会被截断。Handler依然可以处理该消息。 2.2 如果返回值为true,消息将会被截断。Handler中的处理消息方法不会被执行。
    查看全部
  • 使用“Handler”更新UI 1.使用post或postDelayed()方法。 2.在子线程中可以调用post方法。来将更新UI消息加入到队列中。这样就可以更新UI了 其中。需要一个参数。Runnable,在run方法下写更新UI的操作即可。 new Thread(new Runnable() { @Override public void run() { /** * 将Runnable中要执行的内容加入消息队列。 * 可以在这之中更新ui * */ mHandler.post(new Runnable() { @Override public void run() { mTextView.setText("我是被更新后的值"); } }); } }).start(); 3.使用mHandler.postDelayed(myRunnable, 1000);更新UI同样道理,但是会在延迟时间之后执行。可以使用其来进行轮换操作
    查看全部

举报

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

微信扫码,参与3人拼团

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

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