iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android App在线程中创建handler的方法讲解
  • 885
分享到

Android App在线程中创建handler的方法讲解

方法handlerapp线程Android 2022-06-06 08:06:27 885人浏览 八月长安
摘要

相关概念 1.Handler:可以看做是一个工具类,用来向消息队列中插入消息的; 2.Thread:所有与Handler相关的功能都是与Thread密不可分的,Handler会

相关概念
1.Handler:可以看做是一个工具类,用来向消息队列中插入消息的;
2.Thread:所有与Handler相关的功能都是与Thread密不可分的,Handler会与创建时所在的线程绑定;
3.Message:消息;
4.MessageQueue:消息队列,对消息进行管理,实现了一个Message链表;
5.Looper:消息循环,从MessageQueue中取出Message进行处理;
6.HandlerThread:继承Thread,实例化时自动创建Looper对象,实现一个消息循环线程.

Android开发中经常会使用到线程,一想到线程,一般都会想到:


new Thread(){...}.start();

这样的方式。这样如果在一个Activity中多次调用上面的代码,那么将创建多个匿名线程,如果这些线程的没有被销毁,那肯定会影响性能呢。这个时候我么就想到了android提供的一个异步处理线程的类HandlerThread。

一般Handler的用法


Handler handler = new Handler(){...};

这样创建的handler是在主线程即UI线程下的Handler,即这个Handler是与UI线程下的默认Looper绑定的(当然也只有主线程才能这么干,子线程是干不了的,除非自己创建个looper)。因此,有些时候会占用ui主线程,引起一些问题,所以我们就想到了重新创建个子线程,来处理handler。。。。
使用HandlerThread解决问题

HandlerThread实际上继承于Thread,只不过它比普通的Thread多了一个Looper。我们可以使用下面的例子创建Handler


HandlerThread thread = new HandlerThread("MyHandlerThread");
thread.start();

创建HandlerThread时要把它启动了,即调用start()方法。

接着就是handler的使用,如下:


mHandler = new Handler(thread.getLooper());
//TODO:you can post or send something....

创建Handler时将HandlerThread中的looper对象传入。那么这个mHandler对象就是与HandlerThread这个线程绑定了(这时就不再是与UI线程绑定了,这样它处理耗时操作将不会阻塞UI)。


线程中消息处理的流程图

2016324142334101.png (558×479)

消息插入队列的位置由参数uptimeMillis来确定。

Handler与线程的关系

2016324142408465.png (556×342)

1.HandlerThread就是一个封装了Looper的Thread.
2.Handler会与实例化时所在的线程绑定.

UI线程与子线程通信相关

2016324142428965.png (556×325)

1.需要更新UI,则需要使用与主线程绑定的Handler发送消息,若使用在子线程中创建的Handler则会抛出异常;
2.子线程中实例化Handler对象首先需要调用Looper.prepare(),否则会抛出异常;
3.调用Looper.loop()方法消息循环才会启动;
使用Handler时一些需要注意的地方
Looper.prepare(),主线程使用handler,系统默认prepare了,子线程中创建handler必须在前面Looper.prepare(),后面加上Looper.loop();

源码中:
主线程:
在程序启动的时候,系统已经帮我们自动调用了Looper.prepare()方法。查看ActivityThread中的main()


public static void main(String[] args) { 
SamplingProfilerIntegration.start(); 
CloseGuard.setEnabled(false); 
Environment.initForCurrentUser(); 
EventLogger.setReporter(new EventLoggingReporter()); 
Process.setArgV0("<pre-initialized>"); 
Looper.prepareMainLooper(); 
ActivityThread thread = new ActivityThread(); 
thread.attach(false); 
if (sMainThreadHandler == null) { 
  sMainThreadHandler = thread.getHandler(); 
} 
AsyncTask.init(); 
if (false) { 
  Looper.myLooper().setMessageLogging(new LogPrinter(Log.DEBUG, "ActivityThread")); 
} 
Looper.loop(); 
throw new RuntimeException("Main thread loop unexpectedly exited"); 
} 

请注意Looper.prepareMainLooper():


public static final void prepareMainLooper() { 
prepare(); 
setMainLooper(myLooper()); 
if (Process.supportsProcesses()) { 
  myLooper().MQueue.mQuitAllowed = false; 
} 
} 

子线程:


new Thread(new Runnable() { 
    @Override 
    public void run() { 
      Looper.prepare()
      handler2 = new Handler(); 
      Looper.loop() 
    } 
  }).start();

如果没有Looper.prepare().会报错:

Can't create handler inside thread that has not called Looper.prepare()
因为没looper对象创建

looper.prepare()源码:


public static final void prepare() { 
if (sThreadLocal.get() != null) { 
  throw new RuntimeException("Only one Looper may be created per thread"); 
} 
sThreadLocal.set(new Looper()); 
} 

    
   

您可能感兴趣的文章:Android handler 详解(面试必问)浅谈Android应用的内存优化及Handler的内存泄漏问题详解Android中Handler的内部实现原理详解Android中Handler的使用方法Android使用Handler实现定时器与倒计时器功能


--结束END--

本文标题: Android App在线程中创建handler的方法讲解

本文链接: https://www.lsjlt.com/news/25359.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android中创建子线程的方式详解
    在 Android 中,创建子线程的方式通常有以下几种: 使用 Thread 类进行创建 Thread 是 Java 中的一个类,可以通过继承 Thread 类或者创建 Thread...
    99+
    2023-05-18
    Android创建子线程方式 Android创建子线程 Android子线程
  • 在java中创建守护线程的方法
    本篇文章为大家展示了在java中创建守护线程的方法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java线程分为两类分别为daemon线程(守护线程)和User线程(用户线程),在JVM启动时候会调...
    99+
    2023-05-31
    java 守护线程 ava
  • Android入门之在子线程中调用Handler详解
    目录简介本章示例前端代码后端代码简介 前一章我们以一个简单的小动画来解释了Handler。 这章我们会介绍在子线程里写Handler。如果是Handler写在了子线程中的话,我们就需...
    99+
    2022-12-08
    Android子线程调用Handler Android调用Handler Android 子线程 Handler
  • Java线程的创建方法
    这篇文章主要讲解了“Java线程的创建方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java线程的创建方法”吧!多线程指的是一个程序运行时,会包含多个线程同时进行。Java创建线程有三种...
    99+
    2023-06-02
  • Android创建线程池的方式有哪些
    在Android中,可以使用以下方式创建线程池:1. 使用ThreadPoolExecutor类:可以通过new ThreadPoo...
    99+
    2023-10-18
    Android
  • python创建堆的方法实例讲解
    1、说明 创建堆有两种基本方法:heappush() 和 heapify()。 当使用heappush()时,当新元素添加时,堆得顺序被保持了。 如果数据已经在内存中,则使用 hea...
    99+
    2024-04-02
  • Java创建线程的方式解析
    目录继承Thread,这里使用匿名内部类实现Runnable接口,配合Thread类,同样用匿名内部类FutureTask配合Thread继承Thread,这里使用匿名内部类 @Sl...
    99+
    2024-04-02
  • Android编程之数据库的创建方法详解
    本文实例讲述了Android编程之数据库的创建方法。分享给大家供大家参考,具体如下:主javapackage com.itheima.createdatabase;import android.app.Activity;import and...
    99+
    2023-05-30
    android 数据库 创建
  • 创建线程的三种基本方法
    这篇文章主要讲解了“创建线程的三种基本方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“创建线程的三种基本方法”吧!挺基础的知识,一开始不是很愿意写,毕竟这...
    99+
    2024-04-02
  • mfc创建线程的方法有哪些
    MFC (Microsoft Foundation Class) 是一个用于开发Windows应用程序的C++类库。在MFC中,可以...
    99+
    2023-09-18
    mfc
  • java创建线程的方法有哪些
    java中创建线程的方法有:1.使用Runnable接口创建;2.使用Thread继承类创建;3.使用Callable和Future创建;java中创建线程的方法有以下几种使用Runnable接口创建public class Runnabl...
    99+
    2024-04-02
  • linux线程的创建方法是什么
    在Linux系统中,可以使用pthread库来创建线程。pthread库是一个POSIX线程库,提供了一系列函数来创建、管理和同步线...
    99+
    2023-08-30
    linux
  • Java多线程 - 创建线程池的方法 - ThreadPoolExecutor和Executors
    文章目录 线程池(重点)线程池介绍实现线程池的方式方式一: 实现类ThreadPoolExecutorThreadPoolExecutor构造器的参数线程池处理Runnable任务线程池处理Callable任务 方式二: ...
    99+
    2023-08-30
    java jvm 开发语言
  • 详解在Java中如何创建多线程程序
    创建多线程程序的第一种方式:创建Thread类的子类 java.lang.Thread类:是描述线程的类,我们想要实现多线程程序,就必须继承Thread类 实现步骤: 1.创建一个T...
    99+
    2024-04-02
  • 详解Java线程池的使用(7种创建方法)
    目录 1. 固定数量的线程池a.  线程池返回结果b. ⾃定义线程池名称或优先级2. 带缓存的线程池3. 执⾏定时任务 a.&nbs...
    99+
    2023-03-24
    Java线程池 Java线程池使用 线程池
  • Java 中创建线程的几种方式
    Java 是一种面向对象的编程语言,它支持多线程编程。多线程编程是指在一个程序中同时运行多个线程,这些线程可以并行执行,以提高程序的效率和性能。Java 提供了多种创建线程的方法,本文将介绍这些方法以...
    99+
    2023-09-13
    java jvm servlet
  • c++创建多线程的方法是什么
    在C++中,有多种方法可以创建多线程。以下是其中几种常见的方法: 使用std::thread类:std::thread类是C++标...
    99+
    2023-10-25
    c++
  • Java都有哪些创建线程的方法
    目录1.继承Thread类1.1 普通类继承Thread1.2 匿名内部类1.3 缺点分析2.实现Runnable接口2.1 普通类实现Runnable2.2 匿名Runnable实...
    99+
    2024-04-02
  • java创建线程的两种方法区别
    在Java中创建一个线程有两种方法:继承Thread类和实现Runnable接口。下面通过两个例子来分析两者的区别:1)继承Thread类public class TestThread extends Thread { int count...
    99+
    2023-05-31
    java 创建线程 ava
  • Java创建多线程的方法有哪些
    这篇“Java创建多线程的方法有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java创建多线程的方法有哪些”文章吧。J...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作