handlerthread

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对象时

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】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 IntentService的使用和源码分析

有些话、适合烂在心里 提交于 2020-02-04 03:00:18
引言 Service服务是Android四大组件之一,在Android中有着举足重轻的作用。Service服务是工作的UI线程中,当你的应用需要下载一个文件或者播放音乐等长期处于后台工作而有没有UI界面的时候,你肯定要用到Service+Thread来实现。因此你需要自己在Service服务里面实现一个Thread工作线程来下载文件或者播放音乐。然而你每次都需要自己去写一个Service+Thread来处理长期处于后台而没有UI界面的任务,这样显得很麻烦,没必要每次都去构建一个Service+Thread框架处理长期处于后台的任务。Google工程师给我们构建了一个方便开发者使用的这么一个框架---IntentService。 IntentService简介 IntentService是一个基础类,用于处理Intent类型的异步任务请求。当客户端调用android.content.Context#startService(Intent)发送请求时,Service服务被启动,且在其内部构建一个工作线程来处理Intent请求。当工作线程执行结束,Service服务会自动停止。IntentService是一个抽象类,用户必须实现一个子类去继承它,且必须实现IntentService里面的抽象方法onHandleIntent来处理异步任务请求。 IntentServic示例

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 是通过

Android中的线程池

寵の児 提交于 2020-01-15 00:20:53
线程池的好处: 重用线程池中的线程,避免因为线程的创建和销毁所带来的性能开销 能有效控制线程池的最大并发数,避免大量线程之间因互相抢占系统资源而导致的阻塞现象 能够对线程进行简单的管理,并能提供定时执行以及指定间隔循环执行等功能 Android中的线程池概念来源于Java中Executor.Exeuctor是一个接口,它的真正实现是ThreadPoolExecutor,它提供了一系列参数来配置线程池,通过不同的参数可以创建不同的线程池 ThreadPoolExecutor的构造函数: public ThreadPoolExecutor ( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue ThreadFactory threadFactory) { } 参数说明: corePoolSize:线程池中的核心线程数,默认情况下,核心线程会在线程池中一直存活,即时它们处于闲置状态。如果将ThreadPoolExecutor的allowCoreThreadTimeOut属性设置为true,那么他将执行超时策略,由我们指定超时时间,超过这个时间,该线程就会被终止 maximumPoolSize:线程池中所能容纳的最大线程数

多线程(四)、Android多线程使用及AsyncTask源码分析

半城伤御伤魂 提交于 2020-01-01 00:59:19
本篇是多线程系列的第四篇,如果对前三篇感兴趣的也可以去看看。 多线程(一)、基础概念及notify()和wait()的使用 多线程(二)、内置锁 synchronized 多线程(三)、线程池 ThreadPoolExecutor 知识点总结 除了前面的线程池的使用外,在Android中,我们除了通过 Thread 创建线程外,还可以通过 AsyncTask 、 IntentService 、 HandleThread 来创建,线程池前面一篇已经详细介绍了,下面对其他几个方法简单的介绍。 1.1、HandleThread 1.1.1、源码 public class HandlerThread extends Thread { int mPriority; int mTid = - 1 ; Looper mLooper; public HandlerThread (String name) { super (name); mPriority = Process.THREAD_PRIORITY_DEFAULT; } public HandlerThread (String name, int priority) { super (name); mPriority = priority; } protected void onLooperPrepared () { } @Override

Android中线程和线程池

江枫思渺然 提交于 2019-12-21 05:10:55
我们知道线程是CPU调度的最小单位。在Android中主线程是不能够做耗时操作的,子线程是不能够更新UI的。在Android中,除了Thread外,扮演线程的角色有很多,如AsyncTask,IntentService和HandlerThread等等。由于内容过多,所以将分为上下两部分,第一部分主要和大家谈谈Android中的线程,以及在Android中的常用的线程池。第二部分我们一起来了解一下AsyncTask的使用和工作原理。 1、HandlerThread HandlerThread是Thread的子类,它是一种可以使用Handler的Thread,它的实现比较简单。我们来看看它的源码: 1 package android.os; 2 3 public class HandlerThread extends Thread { 4 int mPriority; 5 int mTid = -1; 6 Looper mLooper; 7 8 public HandlerThread(String name) { 9 super(name); 10 mPriority = Process.THREAD_PRIORITY_DEFAULT; 11 } 12 13 14 public HandlerThread(String name, int priority) { 15 super

主线程与子线程之间相互通信

流过昼夜 提交于 2019-12-17 13:45:14
在平时写程序时,我们一般都是在子线程中向主线程发送消息,从而完成请求的处理,这个很常见,不用多说了。那么有时候,我们也可能碰到这样子的一种需求:需要主线程来向子线程发送消息,希望子线程来完成什么任务。如果这样子应该怎么做呢?这就是这篇文章将要讨论的内容。 一、HandlerThread类 主线程发送消息给子线程,通常思维逻辑就是:其实很简单,在主线程中实例化一个Handler,然后让他与子线程相关联(只要它与子线程的Looper相关联即可),这样子它处理的消息就是该子线程中的消息队列,而处理的逻辑都是在该子线程中执行的,不会占用主线程的时间。那么我们就来实现一下,看看这样子到底行得通还是行不通。新建项目,修改它的MainActivity的代码,如下即可: 1 package com.example.handldertest; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.os.Looper; 7 import android.util.Log; 8 import android.widget.TextView; 9 10 public class ThreadHandlerActivity extends

Android 多线程和线程池详解

£可爱£侵袭症+ 提交于 2019-12-06 07:47:51
AsyncTask 使用 AsyncTask 需要继承 AsyncTask,重写 doInBackground 方法。 onPreExecute 运行在调度线程 doInBackground 运行在线程池中 onPostExecute / onProgressUpdate / onCancelled 运行在 UI 线程中。 原理 AsyncTask 内部有两个静态线程池 一个线程池 SERIAL_EXECUTOR 表示串行线程池,内部包含一个消息队列,用来保存任务、按顺序调度任务 一个 THREAD_POOL_EXECUTOR 用来执行任务,其线程数量是根据 CPU 核数计算的 一个跑在主线程的 Handler,把执行进度和执行结果的回调发送到主线程 这两个线程池和一个 Handler 都是静态的,实际上是所有的 AsyncTask 对象公用的 特点和缺陷 4.1之前版本需要在主线程完成初始化,现在的版本不需要初始化了 5.0以及之前 AsyncTask 对象必须在主线程创建,execute 方法必须在主线程调用,之后的版本无此限制,但是 onPreExecute 方法会在调度线程执行 一个 AsyncTask 只能执行一次,否则会报错 1.6之前是串行任务,1.6开始采用线程池处理任务,3.0开始又串行任务,但可以使用 executeOnExecutor 并行 一般会把