展开

关键词

Android——Handler

概述Handler是Android的上层接口。通过它可以轻松地将一个任务切换到Handler所在的线程中去执行。通常情况下,Handler的使用场景就是 更新UI。 Message.obtain(); message.what = 1; mHandler.sendMessage(message); } }).start(); }}Handler架构Handler主要包括 主要功能是向池投递( MessageQueue.enqueueMessage)和取走池的( MessageQueue.next)。 Handler:辅助类,主要功能是向池发送各种事件( Handler.sendMessage)和处理相应事件( Handler.handleMessage);Looper:器,不断循环执行 ( Looper.loop),从MessageQueue中读取,按分发分发给目标处理者。?

42710

android入门

CalledFromWrongThreadException在上一节,我们在子线程里面访问网络之后,直接调用ImageView对象的setImageBitmap()修改Ui界面了,所以会报错我们需要,在子线程里面告诉主线程一个 子线程通过Handle发送一条被放到队列里面,主线程里有一个Looper的轮询器如果轮询器发现了新的,调用Handle对象的handleMessage()来处理Handler是一个处理器必须在主线程里面 在主线程的成员属性里面定义Handler,直接new Handler匿名内部重写他的handleMessage()方法子线程里面,调用Handler对象的sendMessage(msg)方法,把放入队列 ; protected static final int ERROR = 1; private EditText et_path; private ImageView iv_pic; 主线程里面定义处理器 code == 200) { InputStream is = conn.getInputStream(); Bitmap bp = BitmapFactory.decodeStream(is); 发送

17320
  • 广告
    关闭

    50+款云产品免费体验

    提供包括云服务器,云数据库在内的50+款云计算产品。打造一站式的云产品试用服务,助力开发者和企业零门槛上云。

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    深入理解Android

    在日常的开发中,Android作为系统运行的根本之一,显得十分的重要。 到这里基本的Android就分析完了,简而言之就是,Handler 不断的将Message发送到一 根据时间进行排序的优先队列里面,而线程中的 Looper 则不停的从MQ里面取出,分发到相应的目标 分析完基本的,既然 Looper 的 looper 方法是一个for(;;;)循环,那么新的问题提出来了。为什么Android会在主线程使用死循环? C层发出的和Java层发出的可以没有任何关系。所以 Framework 层只是很巧的利用了底层 epoll 的达到阻塞的目的。 总结作为 Android 的基础,还是非常有深入了解的必要。对于我们遇到Handler发送的时候跑出的系统异常的排查也很有意义。

    28520

    深入理解Android

    前言 Android主要说的是Handler的运行,相信大家对Handler已经非常熟悉了,Handler可以轻松的将一个任务切换到Handler所在的线程中去执行。 首先Android的UI控件不是线程安全的,如果我们在多个线程中可以同时操作UI,那么UI控件会处于不可预期的状态,如果在设计的时候对访问UI加上锁,一方面会让访问UI的逻辑变得复杂,得不偿失,另一方便锁会使得访问 二、Android Android主要说的是Handler的运行,Handler的运行需要MessageQueue和Looper,MessageQueue就是队列,它是采用单链表的数据结构来存储列表 而Looper会不断的查看MessageQueue中是否有,当有的时候就取出来。 创建完Handler之后,通过handler的send或者post方法发送,这个会被存储到队列,Looper发现队列中有新的便会处理这个,然后handlermessage方法或者

    26140

    深入理解Android

    前言   Android主要说的是Handler的运行,相信大家对Handler已经非常熟悉了,Handler可以轻松的将一个任务切换到Handler所在的线程中去执行。 首先Android的UI控件不是线程安全的,如果我们在多个线程中可以同时操作UI,那么UI控件会处于不可预期的状态,如果在设计的时候对访问UI加上锁,一方面会让访问UI的逻辑变得复杂,得不偿失,另一方便锁会使得访问 二、Android       Android主要说的是Handler的运行,Handler的运行需要MessageQueue和Looper,MessageQueue就是队列 而Looper会不断的查看MessageQueue中是否有,当有的时候就取出来。 创建完Handler之后,通过handler的send或者post方法发送,这个会被存储到队列,Looper发现队列中有新的便会处理这个,然后handlermessage方法或者

    15120

    代码分析Android

    所以我们常使用Handler来实现线程间的传递,这里讨论的也就是Handler的运行。Handler的运行主要由两个类来支撑:Looper与MessageQueue。 熟悉开发的朋友都知道在子线程中默认是无法创建Handler的,这是因为子线程中不存在队列。

    11920

    深入理解 Android 原理

    导语: 本文讲述的是Android原理,从Java到Native代码进行了梳理,并结合其中使用到的Epoll模型予以介绍。 我们可以粗糙的认为中关键的几个类的功能如下: Handler:处理者 Looper:调度者 MessageQueue:存放的地方 使用过程: Looper.prepare > #$% Java层 是伴随线程的,也就是说上面的几个类在可以在任何一个线程中都有实例的。 先看Looper吧。 咦,好像只用Java层貌似就能把整个说通了,native代码在哪儿?有何用呢? 在native层的主要表现就是这些。 最后,画了一个粗糙、且不太准确图仅供参考学习

    1.3K41

    Android

    mThreadLocal.set(thread 2); System.out.println( mThreadLocal = + mThreadLocal.get()); } }.start(); } }从控台输出可以看到

    24340

    Android

    Android主要是指Handler 的运行以及Handler 所附带的MessageQueue 和Looper 的工作过程,这三者实际上是一个整体,只不过我们在开发过程中比较多地接触到 这是因为Android 的UI控件不是线程安全的,如果在多线程中并发访问可能会导致UI 控件处于不可预期的状态,那为什么系统不对UI 控件的访问加上锁呢? 缺点有两个:首先加上锁会让UI 访问的逻辑变得复杂;其次锁会降低UI 访问的效率,因为锁会阻塞某些线程的执行。 ,这个同样会在Looper中去处理。 当Handler 的send 方法被调用时,它会调用MessageQueue 的enqueueMessage方法将这个放入队列中,然后Looper 发现有新到来时,就会处理这个,最终中的

    14220

    Tip | Android

    13100

    又一年对Android(Handler&Looper)的思考

    个人博客地址 http:dandanlove.com前言Android对于每一个Android开发者来说都不陌生,在日常的开发中我们不可避免的要经常涉及这部分的内容。 从开发角度来说,Handler是Android的上层接口,这使得在开发过程中只需要和Handler交互即可。 Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); }};利用Handler发送 、发送】这些内容。 【源码分析】Handler创建上面我们介绍了Handler的使用,并且带着疑问【Handler使用的每一行代码我们都知道他的具体作用以及异步线程中是怎么传递的么】?

    49930

    Android 进阶14:源码解读 Android ( Message MessageQueue Handler Looper)

    前言本来我以为自己很了解 Handler,在印象中 Android 无非就是:Handler 给 MessageQueue 添加然后 Looper 无限循环读取再调用 Handler 处理整体的流程有了 Android 主要涉及 4 个类:MessageMessageQueueHandlerLooper我们依次结合源码分析一下。 Message“”,其中要传递的就是 Message,官方对它的描述是: 包含任意类型的对象和描述信,可以被发送给 Handler。 Message 的主要属性如下: 用来标识一个,接收方可以根据它知道这个是做什么的 public int what; 如果你的要传递的数据是整型的,可以直接使用 arg1 和 arg2, 当前的标志,只在被 Messenger 传递时使用,其他情况下都是 -1 public int sendingUid = -1; 标识当前是否在被使用 当一个入队时这个标志会被改变,在被重新获取后重置

    56890

    Android(一)——概述

    Android的开发角度来说,Handler是Android的上层接口,这使得开发过程中只需要和Handler交互即可。 当耗时操作完成以后,需要在UI上做一些改变,由于Android开发规范的限,我们并不能在子线程中访问UI控件,否则会触发异常,这个时候通过Handler就可以更新UI的操作切换到主线程中执行,因此,我们得出结论 Android,主要是指Handler的运行,Handler的运行需要底层的MessageQueue和Looper的支撑 MessageQueue的中文翻译是队列,它的内部存储了一组 Looper在这里理解为循环,由于MessageQueue只是一个的存储单元,它能去处理,而Looper就填补了这个功能,Looper会以无限循环的形式去查找是否有新,如果有的话就处理 ,然后Looper发现有Handler所在队列来时,就会处理Handler中的,最终中的Runnnable或者Handler的handlerMessage方法就会被调用。

    39020

    Android开发之漫漫长途 Ⅶ——Android(Looper Handler MessageQueue Message)

    本篇内容我们来分析Android。我们为什么要介绍Android呢,因为Android系统本质上来说就是一个驱动的系统。 但是理解Android对于理解Android系统的运作包括那些开源框架的原理都有很大帮助。关于Android网上也有好多文章,我本人也看了好多。 ActivityThread既然讨论Android ,如果我们所有的操作都能在一个线程中完成貌似就不需要这个处理了,,但这又是不现实的,正是因为我们不能在一个线程中把所有的工作(网络请求 处理的一部分)。 的,不过有一部分内容需要其他的知识作为基础才能更好的理解。

    20920

    Android异步详解

    Android中的异步分为四个部分:Message、Handler、MessageQueue和Looper。 其中,Message是线程之间传递的,其what、arg1、arg2字段可以携带整型数据,obj字段可以携带一个Object对象。Handler是处理者,主要用于发送和处理。 发送的方法是sendMessage;处理的方法是handleMessage(),Message字段携带的信在该方法中用作判别。 MessageQueue是队列,存放所有Handler发送的。Looper是队列的“管家”,将队列中一条条取出,并分派到Handler的handleMessage()方法中。 ③之后该会被添加到MessageQueue中等待被处理,而Looper会一直尝试从MessageQueue中取出待处理,最后分发回Handler对象中的handleMessage()方法中。

    30110

    Android Handler 处理

    日常开发中,一般不会在子线程中直接进行 UI 操作,大部分采取的办法是创建 Message 对象,然后借助 Handler 发送出去,再在 Handler 的 ...

    32130

    年后面试 15 家大厂,Android成为了面试难关?这招帮你破解!

    image.png年后面了十余家大厂,每家都会问的一个问题就是Android!可见Android是多么重要! 之所以这么重要是因为Android应用程序是通过来驱动的,Android某种意义上也可以说成是一个以驱动的系统,UI、事件、生命周期都和处理相关,并且处理在整个Android 概述1、我们先说下什么是Android处理处理本质:一个线程开启循环模式持续监听并依次处理其他线程给它发的。 这里先给一张Android处理流程图和具体执行动画,如果看不懂没事,接着往下看(后面会结合Android UI主线程来讲解),然后结合着图和动画一块看更能理解整个的实现原理。 今天带着大家先简单了解了下Handler的工作流程,后面会带着大家从源码的角度分析Handler,让大家由内到外完全掌握Android

    16500

    android线程之Handler详解

    android线程主要由Handler,Looper,Message和MessageQuene四个部分组成。 首先我们先介绍这四个类的作用:Handler:的发送者。负责将Message发送到MessageQueue中。 以及通过Runnable,Callback或者handleMessage()来实现的回调处理Looper:是的循环处理器,它负责从MessageQueue中取出Message对象进行处理。 其中MessagePool为池,用于回收空闲的Message对象的。MessageQueue:队列,负责维护待处理的对象。?通过上面的图,我们可以比较清楚地知道他们的作用以及关系。 这样可以做到的复用。

    17031

    Android 线程与源码分析

    1.handler、looper、messagequeue 之间关系messagequeue是用来存储的载体,而lopper是无限循环查找这个载体中是否有, handler是创建并使用lopper 来构建循环。 ,传递给messagequeue的 equeueMessage方法中,而looper是一个无限循环从这个队列中取出,取出来后,中的runnnable或者handler中的handlerMessage 内存泄漏:使用static方法修饰,寄希望ThreadLocal对象失去引用,触发弱引用回收Entry的value不现实。 handler内部采用Linuxpipeepoll实现是一种IO多路复用 主线程没有即阻塞在管道读端,处于休眠状态,如果队列中有,就会往管道写端写入内容,唤醒正在等待的主线程

    14910

    android异步 从源码层面解析(2)

    AsyncTask是一个轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和结果传递给主线程并在主线程中更新UI。

    8521

    相关产品

    • 消息队列 CMQ

      消息队列 CMQ

      腾讯云消息队列(CMQ)是一种分布式消息队列服务,它能够提供可靠的基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)之间的收发消息,存储在可靠有效的 CMQ 队列中,防止消息丢失。CMQ 支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭

      扫码关注云+社区

      领取腾讯云代金券