首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

深入Android HandlerThread 使用及其源码完全解析

构建循环线程,每次任务就取出其中的任务放到线程池去执行,没有就一直处于等待状态,直到新任务被投放进来,如果任务过多就加入等待队列,直到其中一个线程执行完毕就从等待队列获取下一个执行的任务,这样就可以避免过多创建...其内部就是通过Thread+Looper来实现的,说白了HandlerThread就是Android已经封装好的一个拥有自己looper的线程,我们可以利用它执行一些耗时任务。...还记得我们在前面创建完HandlerThread后还要去调用start()方法后才可以去创建Handler吗?这是为什么呢?...的run方法,代码也比较简单,开始就通过Looper.prepare()去创建Looper对象,然后通过同步线程去给当前成员变量mLooper赋值,并唤醒等待线程(后续会解析为什么要唤醒等待线程),然后在...现在我们也就明白了创建HandlerThread为什么要调用start方法了,因为通过调用start方法,程序会去执行run方法,这样才会去创建Looper对象并启动Looper循环,最后我们才能把Looper

28731

Android Handler机制11之Handler机制总结

答:如果让设计,肯定和上面一样: 1 设计一个类,里面有一个死循环去做循环操作; 2 用一个类来抽象代表各种输入信息/消息;这个信息/消息应该还有一个唯一标识符字段;如果这个信息里面有个对象来保存对应的键值对...但我们不使用的时候我们应该用它的quit()或者quitSafely()来终止它的循环。...(四)、HandlerThread和普通Thread的比较 HandlerThread继承自Thread,当线程开启时,也就是它run方法运行起来后,线程同时创建了了一个含有消息队列的Looper,并对外提供自己这个...这种方式开启一个子线程,会创建多个匿名线程,使得程序运行起来越来越慢,而HandlerThread自带Looper使他可以通过消息来多次重复使用当前线程,节省开支。...(五) 小结: 1、HandlerThread将loop转到子线程中去处理,说白了就是分担MainLooper的工作量,降低了主线程压力,使主界面更流程。 2、开启一个线程起到多个线程的作用。

2.6K10

详解 Android 中的 HandlerThread

HandlerThread是Android API提供的一个便捷的类,使用它我们可以快速的创建一个带有Looper的线程,了Looper这个线程,我们又可以生成Handler,那么HandlerThread...如何使用 HandlerThread使用起来很容易,首先需要进行初始化。...至于如何使用HandlerThread来执行任务,主要是调用Handler的API 使用post方法提交任务,postAtFrontOfQueue将任务加入到队列前端,postAtTime指定时间提交任务...如何修改权限 最通用的就是在run方法中,加入合理的设置优先级代码,比如 1 2 3 4 5 6 7 Runnable run = new Runnable() { @Override...} }; LightTaskManager.getInstance().post(run); 上述方法不仅适用于HandlerThread,也可以适用于其他的线程。

68750

安卓handler源码(androidstudio源码)

Thread使用了Handler,那么通过Handler给Thread安排任务也是串行执行的,就是一个执行完才执行下一个,所以这个HandleThread不适多耗时任务,这样任务的执行相互收影响比较严重...估计是当线程启动,在没有获取到looper之前,当前线程是空闲的,也没任务做,就先释放资源,让其他线程先执行run()方法来获取Looper对象,然后将looper赋值给mLooper,【当我看到这里时是很疑惑的...;那么这时候线程A返回的looper其实是在线程B中创建的looper,就很乱了,,,不应该looper和线程相关的吗?...反正是很乱的,问了同事也还没问个明白。一点肯定的,源码中这么玩肯定是没错的,需要一个可以让自己信服的理由。...好了,HandleThread中的疑惑解决了; 接下来,就有了新疑惑,需要继续搞明白,为什么多线程可以共用looper。

42330

android 开发Handler源码剖析

在知道,Handler创建的时候,会默认为我们创建一个Looper对象,那么如何获取当前的Looper呢,这里就使用到了一个TheadLocal的概念,TheadLocal可以轻松的获取当前使用的Looper...在线程中,我们可以通过调用prepare 方法来启动一个消息loop,调用loop方法来通知Looper来处理消息,直至结束。Looper提供了很多的静态方法来与线程、消息队列进行交互。...那么,可不可以在主线程中定义handler,在代码中动态改变handler使之与其他线程的looper相关联呢?是可以的。...Looper的Thead类,HandlerThread HandlerThread自带了一个Lopper, handlerThread=new HandlerThread("handlerThead"...解决的方法两种,一是通过在主线程中定义的handler更新界面,二是直接调用被修改的view的postInvalidate方法刷新单个view。

52570

Android性能优化(十一)之正确的异步姿势

Android开发中我们使用异步来进行耗时操作,异步离不开一个词:线程。那么问题来了: Android中线程调度是如何实现的? 正确的异步姿势是什么呢? 线程池一定会提升效率吗?...线程的优先级应该根据线程的工作量谨慎选择,简单来说,线程优先级应该和该线程期望完成的工作量相反。线程做的工作越多,它的优先级应该越小,以便它不会造成系统资源紧张。...3、 正确的异步姿势 3.1 Thread new Thread(){ @Override public void run() { super.run();...备注:HandlerThread的正确使用姿势:串行场景,并在构造方法中明确指定优先级。...另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个耗时操作,依次执行。

1.2K31

HandlerThread 源码分析

这两个方法一个共同的特点就是:Looper不再接收新的消息了,消息循环就此结束,此时通过Handler发送的消息也不会在放入消息杜队列了,因为消息队列已经退出了。...先说答案:不能退出主线程的消息队列,不然会抛出Main thread not allowed to quit.错误,是不是很熟悉,没错,上面的代码中已经贴出来了,为什么呢,MessageQueue一个字段...Looper,因此一个Handler只能绑定一个Looper,也就意味着,Handler绑定了哪个线程的Looper,那么所有的消息都会在哪个线程执行,这跟上面的图是一致的,当然了同学说在Handler...●在Android一个应用程序"退出"的真正含义是什么呢? 对于这个问题,同学可能说杀掉进程,应用程序挂了,也就相当于退出了。...IPC过程的同学应该都知道了,没错,scheduleExit()不是本地进程调用的,而是由服务端进程ActivityAManagerService服务进行调用的,这也是为什么说退出主线程是由FrameWork

22520

总结--3

HandlerThread实际上就是一个Thread,只不过它比普通的Thread多了一个Looper。...如果创建一个子线程,你希望自己的子线程能够自己的Looper、Handler、MessageQueue你两种方法,一种是像之前创建线程一样,但要在重写的run{}方法里,为线程创建Looper,这种方法比较麻烦...,可以直接使用HandlerThread,没必要在重写run{},因为HandlerThreadrun()方法其中涉及到Looper的创建和启动,Looper.loop()一执行就会进入死循环,就算你重写...继承Thread重写run()没有调用super.run(),HandlerThread重写时就有: Spuer.run()系统自己自动加的,HandlerThread和Thread不大一样,他自己的...Looper,而HandlerThreadrun()方法就是来创建Looper的,系统要确保这个函数会被执行,所以要在覆盖他的函数里添加super.run()来调用HandlerThreadrun

35220

光速2分钟,精通HandlerThread,你还在等什么?

在Android开发中,HandlerThread是Thread的一个特殊子类,它结合了线程和消息处理机制,使得在一个单独的线程中执行任务变得更加简便。...的run()方法 HandlerThreadrun()方法是其核心方法,该方法负责创建Looper并启动消息循环。...Looper.prepare() // 启动消息循环 Looper.loop() } } 在run()方法中,首先调用Looper.prepare()方法来初始化...Looper.prepare()方法会创建一个Looper对象,并将其绑定到当前线程。 然后,调用Looper.loop()方法来启动消息循环。...结语 HandlerThread一个非常有用的类,它可以帮助我们在子线程中方便地使用Handler。在使用HandlerThread时,需要注意其原理和注意事项,以便更好的运用它

10010

HandlerThread源码分析

= priority; } 两个构造方法一个参数的和两个参数的,name代表当前线程的名称,priority为线程的优先级别 2)接着我们来看一下run()方法,在run方法里面我们可以看到我们会初始化一个...HandlerThread的时候必须笑调用start()方法,接着才可以将我们的HandlerThread和我们的handler绑定在一起吗?...其实原因就是我们是在run()方法才开始初始化我们的looper,而我们调用HandlerThread的start()方法的时候,线程会交给虚拟机调度,由虚拟机自动调用run方法 mHandlerThread.start...这里等待方法wait和run方法中的notifyAll方法共同完成同步问题。...= null); } } } 到此HandlerThread源码分析为止 关于IntentService的,可以参考的这一篇博客IntentService使用及源码分析 关于Handler

27910

Android的离奇陷阱 — 设置线程优先级导致的微信卡顿惨案

这是为什么?背后有怎样秘密?又如何管控和避免?我们来一起深入分析、研究下这个问题。...但是,还是不对劲啊,设置的明明只是特定子线程的优先级,按道理说只会影响该子线程的TimerSlack才对啊,为什么看起来影响了所有的线程呢?确实,这个问题还有很多疑点,我们接着分析。 3.2....调用ht.serPriority(3)其实设置的是其父类Thread的priority成员变量,而HandlerThread本身自己的mPriority成员变量,start之后,会在创建Native...Thread的时候,在调用run回调方法前,根据Java层Thread的priority(我们已经设置为了3)设置Native的nice值,这时的确优先级能够设置成功。...但是HandlerThread自己重写了run方法,在之后执行的run方法中,又再次通过Process.setThreadPriority(mPriority)设置了自己的优先级为mPriority,而

4.4K63

Android Framework中的线程Thread及它的threadLoop方法

它们普遍的特点就是一个threadLoop方法。按照字面的意思应该是这个线程能够循环处理数据。...对应想到到了java上层中的HandlerThread,这个估计也差不多,但当时心里总有一个疙瘩,想弄清楚它为什么能够循环,还有它到底是怎么循环起来的?...在java中Thread的run方法就是启动,这个也应该如此。但是如之前的源码所示AudioWatchdog.cpp中并没有实现run方法,怎么办呢?别紧张,它还有父类Thread....所以在这里,开始时的疑问—为什么线程Thread中的threadLoop()能够循环处理数据就到此做了说明。...还有,最关键的一点是threadLoop能够循环其实是因为调用它的_threadLoop()方法里面有一个while循环。

2.1K20

Android多线程介绍

前言 今天分享的面试题/知识点是: Android中多线程如何实现?哪些方式?该怎么选择?...它的原理其实就是在HandlerThread线程内部一个Looper变量,进行loop()的死循环,然后通过MessageQueue进行一系列任务的排队和处理。...那么这个HandlerThread到底什么实际应用呢?...(其实在实际项目中用的很少,一般用Executors.newSingleThreadExecutor()方法代替,一样的线程中管理任务队列,后面会详细说到线程池) AsyncTask AsyncTask...的建议是: 轻量级,简单的任务可以直接用 AsyncTask 需要后台管理,用到上下文的时候用IntentService 其余场景都用线程池,毕竟线程池是最推荐,最优化的线程管理方法 感谢大家的阅读,

51650

源码分析Android中的线程和线程池

在AsyncTask的构造方法中有如下代码,由于FutureTask的run方法会调用mWorker的call方法,因此mWorker的call方法最终会在线程池中执行: public AsyncTask...HandlerThread工作原理 HandlerThread继承了Thread,它是一种可以使用Handler的Thread,它的实现也是很简单,就是在run方法中通过Looper.prepare(...)来创建消息队列,并通过Looper.loop()来开启消息循环,这样在实际的使用中就允许HandlerThread中创建Handler了,HandlerThreadrun方法如下所示: @Override...在内部创建了消息队列,外界需要通过Handler的消息方式类通知HandlerThread执行一个具体的任务,HandlerThread一个具体的使用场景就是IntentService。...HandlerThread,然后使用它的Looper来构造一个Handler对象的mServiceHandler,这样通过mServiceHandler发送的消息最终都会在HandlerThread中执行

32320
领券