looper

android Handler机制详解

心不动则不痛 提交于 2021-02-16 13:07:25
一、几个相关概念简述: 1、MessageQueue: 消息队列,存放消息的容器。 注意 :每一个线程最多只有一个MessageQueue,创建一个线程的时候,并不会自动创建其MessageQueue。通常使用一个Looper对象对该线程的MessageQueue进行管理。主线程创建时,会创建一 个默认的Looper对象,而Looper对象的创建,将自动创建一个MessageQueue。其他非主线程,不会自动创建Looper,要需要的时候,通过调用prepare函数来实现。 2、Message:消息对象,存储与MessageQueue中,一个MessageQueue包含多个Message对象,这些Message对象遵循先进先出的原则。 注意 :通常会new一个message实例对象,或者通过Handler对象的obtainMessage()获取一个Message实例,使用removeMessages()方法可以将消息从队列中删除; 3、Looper:消息封装的载体,是MessageQueue的管理者。每一个MessageQueue都不能脱离Looper而存在,Looper对象的创建是通过prepare函数来实现的。同时每一个Looper对象和一个线程关联。通过调用Looper.myLooper()可以获得当前线程的Looper对象。 注意: 创建一个Looper对象时

Does an Android Looper thread use processing power?

你。 提交于 2021-02-08 08:23:55
问题 This question would probably also apply to the general world of Java threads... I have a thread that I use like so (this is in the run method): Looper.prepare(); Handler rHandler = new Handler(){ @Override public void handleMessage(Message msg) { //ommited... } }; Looper.loop(); My question is whether the thread is using CPU while it's waiting for things to be pushed to the Handler? Or is it really "sleeping"? Can having a couple of such threads bog down the system? 回答1: Underneath the hood,

Why main thread's Looper.loop() doesn't block UI thread?

邮差的信 提交于 2020-05-12 04:59:02
问题 Today I read some blogs and source code about how Handler & Looper work together. Based on what I've learnt, we can have only one Looper on each thread by using the ThreadLocal magic. Usually Handler is initiated in main thread, or else you must manually start or saying, prepare the Looper on a separate thread and then loop it up. class LooperThread extends Thread { public Handler mHandler; public void run() { Looper.prepare(); mHandler = new Handler() { public void handleMessage(Message msg)

Why main thread's Looper.loop() doesn't block UI thread?

生来就可爱ヽ(ⅴ<●) 提交于 2020-05-12 04:58:10
问题 Today I read some blogs and source code about how Handler & Looper work together. Based on what I've learnt, we can have only one Looper on each thread by using the ThreadLocal magic. Usually Handler is initiated in main thread, or else you must manually start or saying, prepare the Looper on a separate thread and then loop it up. class LooperThread extends Thread { public Handler mHandler; public void run() { Looper.prepare(); mHandler = new Handler() { public void handleMessage(Message msg)

Android HandlerThread 的使用及其Demo

ぃ、小莉子 提交于 2020-03-18 14:06:32
今天我们一起来学习下一个Android中比较简单的类 HandlerThread ,虽然它的初始化有点小麻烦。 介绍 首先我们来看看为什么我们要使用 HandlerThread ?在我们的应用程序当中为了实现同时完成多个任务,所以我们会在应用程序当中创建多个线程。为了让多个线程之间能够方便的通信,我们会使用 Handler 实现线程间的通信。 下面我们看看如何在线程当中实例化 Handler 。在线程中实例化 Handler 我们需要保证线程当中包含Looper( 注意 : UI-Thread默认包含Looper )。 为线程创建Looper的方法如下:在线程run()方法当中先调用Looper.prepare()初始化Looper,然后再run()方法最后调用Looper.loop(),这样我们就在该线程当中创建好Looper。( 注意 : Looper.loop()方法默认是死循环 ) 我们实现Looper有没有更加简单的方法呢?当然有,这就是我们的 HandlerThread 。我们来看下 Android 对 HandlerThread 的描述: Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note

Android Looper和Handler分析

只愿长相守 提交于 2020-03-02 12:29:19
Android应用程序是通过消息来驱动的,每个应用程序都有一个Main looper在ActivityThread中创建。我们这一节中就主要来分析下Looper和Handler的实现机制,首先来简单介绍一下它们的关系: ▪Thread、Looper、MessageQueue、Handler的关系 –Thread线程是整个Looper循环执行的场所 –Looper消息泵,不断的从MessageQueue中读取消息并执行,Looper就是一个无限循环,Looper中包含MessageQueue –MessageQueue消息队列,负责存放消息 –Looper分发消息给Handler执行;Handler同时可以向MessageQueue添加消息 我们通过下面一个简单的程序来看一下如何使用Looper和Handler: [java] view plain copy class LooperThread extends Thread { public Handler mHandler; public void run() { Looper.prepare(); mHandler = new Handler() { public void handleMessage(Message msg) { // process incoming messages here } }; Looper

【Android】IntentService & HandlerThread源码解析

大憨熊 提交于 2020-02-04 03:05:07
一、前言   在学习Service的时候,我们一定会知道IntentService:官方文档不止一次强调,Service本身是运行在主线程中的(详见: 【Android】Service ),而主线程中是不适合进行耗时任务的,因而官方文档叮嘱我们一定要在Service中另开线程进行耗时任务处理。IntentService正是为这个目的而诞生的一个优雅设计,让程序员不用再管理线程的开启和允许。   至于介绍HandlerThread,一方面是因为IntentService的实现中使用到了HandlerThread,另一方面是因为IntentService和HandlerThread以及很多Android中的类一样,其实都是为了方便某个目的,对最基本的类进行的一定的扩充,并且结构精巧,便于使用,很适合阅读研究。 二、HandlerThread源码 先来一段结结实实的完整源码: 1 /* 2 * Copyright (C) 2006 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You

Android中的消息处理机制

血红的双手。 提交于 2020-02-01 18:55:02
安卓中的消息处理机制主要涉及到5个概念 (1)消息类:Message,可以理解成一个数据单元; (2)消息队列类:Message Queue,存放通过Hander发布的消息,处理顺序类似于队列,按照先进先出的顺序执行; (3)消息操作类:Handler,用于处理包装在Message中的数据; (4)消息通道类:Looper,它是Message Quene和Handler的桥梁,循环取出Message Quene中的Message交给相应Handler处理; (5)线程:UI thread,每一个线程可含有一个Looper对象以及一个Message Quene数据结构; 处理流程大致如下: (1)包装Message对象(把数据封装在Message对象中); (2)通过Handler的sendMessage()等方法把Message发送出去; (3)在Handler的处理方法中将Message添加到Handler所绑定的Looper的MessageQuene上; (4)Looper的loop()方法通过循环不断地从MessageQuene中提去Message进行处理,并移除处理完的Message (5)调用Message绑定的Handler对象的dispatchMessage()方法完成对消息的处理。 来源: https://www.cnblogs.com/liuleliu/p

Android四大组件之Service

不羁岁月 提交于 2020-01-24 05:06:30
在 Android 四大组件之中,除了 Activity 之外,最常用的就是 Service 了。先来看一下官方对 Service 的介绍 : Service是一个可以在后台执行需要长时间运行的操作的应用组件,它不提供用户界面。其它组件可以启动一个Service ,之后即使用户切换到别的应用里,这个Service 也将继续在后台运行。此外,一个组件可以与一个Service绑定来与之交互,甚至可以进行进程间通信。服务可以在后台执行很多任务,比如处理网络事务,播放音乐,文件读写或者与一个内容提供者交互等等。 由此可见,Service 的用途还是十分广泛的,我们在开发中经常会用到 Service,所以应该对 Service 有一定的了解。 Service 有一个非常需要注意的地方就是它其实是 运行在主线程中的 ,如果是刚了解 Service 的人,很容易会误以为 Service 是另开一个新线程运行的。所以我们一定要注意,不要在 Service 中执行一些耗时操作,从而导致线程阻塞。 想要了解Service,那么就要先了解Service的生命周期,幸运的是,Service的生命周期比起Activity要简单的多。如下 : 上图展示了 Service 在两种形式下的生命周期。下面说明 Service 的两种形式 : 未绑定形式 Service: 该形式的 Service 是通过

Handler简析

无人久伴 提交于 2020-01-20 22:37:16
Handler简析 主线程Looper创建 ActivityThread main()→ActivityThread Looper.prepareMainLooper()(创建全局唯一主线程Looper对象)→Looper prepare()→Looper sThreadLocal.set(new Looper(quitAllowed)) public static void prepareMainLooper() { prepare(false); synchronized (Looper.class) { if (sMainLooper != null) { throw new IllegalStateException("The main Looper has already been prepared."); } sMainLooper = myLooper(); } } private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() != null) { throw new RuntimeException("Only one Looper may be created per thread"); } sThreadLocal.set(new Looper(quitAllowed)); }