【☆】如何通过HandlerThread来执行一个具体任务?...HandlerThread的典型使用场景? HandlerThread的基本使用流程? HandlerThread是如何做到一个线程能够一直运行,有新的任务就处理,没有任务就等待?...HandlerThread的构造方法 HandlerThread的run()做了哪些事情? HandlerThread如何退出?...quit/quit或quitSafely HandlerThread的Tid有什么用? 为什么run中有notifyAll,getLooper中有wait? 为什么要设置线程优先级?...是如何做到一个线程能够一直运行,有新的任务就处理,没有任务就等待?
大家好,又见面了,我是你们的朋友全栈君。 本文我们将学习HandlerThread的实现原理,以及开发时,如何正确的使用它来实现我们的开发任务。...我们来看HandlerThread的构造函数,这里有2个重载版本。...HandlerThread的run方法: @Override public void run() { mTid = Process.myTid(); Looper.prepare...实例之后,调用start()方法执行,ART虚拟机会帮我们创建一个线程对象,然后在子线程中执行run方法。...run方法中,执行了Looper.prepare()方法,创建了一个Looper对象并绑定到该线程。 然后在同步块中,执行了mLooper的赋值,调用notifyAll通知Looper已创建完成。
答:如果让我设计,肯定和上面一样: 1 设计一个类,里面有一个死循环去做循环操作; 2 用一个类来抽象代表各种输入信息/消息;这个信息/消息应该还有一个唯一标识符字段;如果这个信息里面有个对象来保存对应的键值对...但我们不使用的时候我们应该调用它的quit()或者quitSafely()来终止它的循环。...(四)、HandlerThread和普通Thread的比较 HandlerThread继承自Thread,当线程开启时,也就是它run方法运行起来后,线程同时创建了了一个含有消息队列的Looper,并对外提供自己这个...这种方式开启一个子线程,会创建多个匿名线程,使得程序运行起来越来越慢,而HandlerThread自带Looper使他可以通过消息来多次重复使用当前线程,节省开支。...(五) 小结: 1、HandlerThread将loop转到子线程中去处理,说白了就是分担MainLooper的工作量,降低了主线程压力,使主界面更流程。 2、开启一个线程起到多个线程的作用。
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,也可以适用于其他的线程。
当有Thread使用了Handler,那么通过Handler给Thread安排任务也是串行执行的,就是一个执行完才执行下一个,所以这个HandleThread不适多耗时任务,这样任务的执行相互收影响比较严重...我估计是当线程启动,在没有获取到looper之前,当前线程是空闲的,也没任务做,就先释放资源,让其他线程先执行run()方法来获取Looper对象,然后将looper赋值给mLooper,【当我看到这里时是很疑惑的...;那么这时候线程A返回的looper其实是在线程B中创建的looper,我就很乱了,,,不应该looper和线程相关的吗?...反正我是很乱的,问了同事也还没问个明白。有一点肯定的,源码中这么玩肯定是没错的,我需要一个可以让自己信服的理由。...好了,HandleThread中的疑惑解决了; 接下来,我就有了新疑惑,我需要继续搞明白,为什么多线程可以共用looper。
Android开发中我们使用异步来进行耗时操作,异步离不开一个词:线程。那么问题来了: Android中线程调度是如何实现的? 正确的异步姿势是什么呢? 线程池一定会提升效率吗?...线程的优先级应该根据线程的工作量谨慎选择,简单来说,线程优先级应该和该线程期望完成的工作量相反。线程做的工作越多,它的优先级应该越小,以便它不会造成系统资源紧张。...3、 正确的异步姿势 3.1 Thread new Thread(){ @Override public void run() { super.run();...备注:HandlerThread的正确使用姿势:串行场景,并在构造方法中明确指定优先级。...另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个耗时操作,依次执行。
线程之间通信有很多方法,如信号量、 管道、 共享内存、共享文件、 消息队列等。...这些方法中用的最多的还是消息队列,围绕着消息队列我们一般有两种线程模型: 第一、创建一个新线程,然后从消息队列中取出一个任务,执行这个任务,完成任务后线程结束。...什么是Looper Looper是一个消息分发器,它的作用是从消息队列中取出消息,然后做消息分发。我们看一下它是如何实现的。...loop 函数,我们看一下它是如何实现的: /** * Run the message queue in this thread....理解HandlerThread HandlerThread应该叫LooperThread更合适,其实它就是包含了Looper对象的线程。
我在知道,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。
这两个方法有一个共同的特点就是:Looper不再接收新的消息了,消息循环就此结束,此时通过Handler发送的消息也不会在放入消息杜队列了,因为消息队列已经退出了。...先说答案:不能退出主线程的消息队列,不然会抛出Main thread not allowed to quit.错误,是不是很熟悉,没错,上面的代码中已经贴出来了,为什么呢,MessageQueue有一个字段...Looper,因此一个Handler只能绑定一个Looper,也就意味着,Handler绑定了哪个线程的Looper,那么所有的消息都会在哪个线程执行,这跟上面的图是一致的,当然了有同学说我在Handler...●在Android一个应用程序"退出"的真正含义是什么呢? 对于这个问题,有同学可能说我杀掉进程,应用程序挂了,也就相当于退出了。...IPC过程的同学应该都知道了,没错,scheduleExit()不是本地进程调用的,而是由服务端进程ActivityAManagerService服务进行调用的,这也是我为什么说退出主线程是由FrameWork
其实他在MessageQueue的next()方法中已经有了对应的解决方案了。...既然知道了IdleHandler的存在,就看看他的具体运作方式是如何的,而最主要的就是他的接口方法queueIdle()。...废了这么多话,其实讲实话啊,他就是我上面已经说过的Thread+Handler的模式,但是有一个事情要突破啊,Looper咋办?先放一下,让我们先看看他的使用方法吧。...那只好先让我们先看看HandlerThread的家庭里有哪些成员了。...当然你要知道使用ThreadLocalMap是一个通过消耗空间来换取时间效率的方案。 Q3:为什么Handler构造方法里面的Looper不是new出来的? 这个问题的性质和问题2有点类似了,唯一性。
在Android开发中,HandlerThread是Thread的一个特殊子类,它结合了线程和消息处理机制,使得在一个单独的线程中执行任务变得更加简便。...的run()方法 HandlerThread的run()方法是其核心方法,该方法负责创建Looper并启动消息循环。...Looper.prepare() // 启动消息循环 Looper.loop() } } 在run()方法中,首先调用Looper.prepare()方法来初始化...Looper.prepare()方法会创建一个Looper对象,并将其绑定到当前线程。 然后,调用Looper.loop()方法来启动消息循环。...结语 HandlerThread是一个非常有用的类,它可以帮助我们在子线程中方便地使用Handler。在使用HandlerThread时,需要注意其原理和注意事项,以便更好的运用它。
HandlerThread实际上就是一个Thread,只不过它比普通的Thread多了一个Looper。...如果创建一个子线程,你希望自己的子线程能够有自己的Looper、Handler、MessageQueue你有两种方法,一种是像之前创建线程一样,但要在重写的run{}方法里,为线程创建Looper,这种方法比较麻烦...,可以直接使用HandlerThread,没必要在重写run{},因为HandlerThread的run()方法其中涉及到Looper的创建和启动,Looper.loop()一执行就会进入死循环,就算你重写...继承Thread重写run()没有调用super.run(),HandlerThread重写时就有: Spuer.run()系统自己自动加的,HandlerThread和Thread不大一样,他有自己的...Looper,而HandlerThread的run()方法就是来创建Looper的,系统要确保这个函数会被执行,所以要在覆盖他的函数里添加super.run()来调用HandlerThread的run(
= 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
它们普遍的特点就是有一个threadLoop方法。按照字面的意思应该是这个线程能够循环处理数据。...对应我想到到了java上层中的HandlerThread,这个估计也差不多,但当时心里总有一个疙瘩,想弄清楚它为什么能够循环,还有它到底是怎么循环起来的?...在java中Thread的run方法就是启动,这个也应该如此。但是如之前的源码所示AudioWatchdog.cpp中并没有实现run方法,怎么办呢?别紧张,它还有父类Thread....所以在这里,我开始时的疑问—为什么线程Thread中的threadLoop()能够循环处理数据就到此做了说明。...还有,最关键的一点是threadLoop能够循环其实是因为调用它的_threadLoop()方法里面有一个while循环。
这是为什么?背后有怎样秘密?又如何管控和避免?我们来一起深入分析、研究下这个问题。...但是,还是不对劲啊,我设置的明明只是特定子线程的优先级,按道理说只会影响该子线程的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,而
然而在Android系统中为什么存在工作者线程呢,常用的工作者线程有哪些不易察觉的问题呢,关于工作者线程有哪些优化的方面呢,本文将一一解答这些问题。...因而,在Android中使用工作者线程显得势在必行,如一开始提到那样,在Android中工作者线程有很多,接下来我们将围绕AsyncTask,HandlerThread等深入研究。...然而AsyncTask并非一个完美的方案,使用它往往会存在一些问题。接下来将逐一列举AsyncTask不容易被开发者察觉的问题。...关于如何避免内存泄露,我们可以使用静态内部类 + 弱引用的形式解决。...对于某些情况下,有可能无法打断正在执行的任务 如下,就是一个cancel方法无法打断正在执行的任务的例子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
前言 今天分享的面试题/知识点是: Android中多线程如何实现?有哪些方式?该怎么选择?...它的原理其实就是在HandlerThread线程内部有一个Looper变量,进行loop()的死循环,然后通过MessageQueue进行一系列任务的排队和处理。...那么这个HandlerThread到底有什么实际应用呢?...(其实我在实际项目中用的很少,一般用Executors.newSingleThreadExecutor()方法代替,一样的线程中管理任务队列,后面会详细说到线程池) AsyncTask AsyncTask...我的建议是: 轻量级,简单的任务可以直接用 AsyncTask 需要后台管理,用到上下文的时候用IntentService 其余场景都用线程池,毕竟线程池是最推荐,最优化的线程管理方法 感谢大家的阅读,
在AsyncTask的构造方法中有如下代码,由于FutureTask的run方法会调用mWorker的call方法,因此mWorker的call方法最终会在线程池中执行: public AsyncTask...HandlerThread工作原理 HandlerThread继承了Thread,它是一种可以使用Handler的Thread,它的实现也是很简单,就是在run‘方法中通过Looper.prepare(...)来创建消息队列,并通过Looper.loop()来开启消息循环,这样在实际的使用中就允许HandlerThread中创建Handler了,HandlerThread的run方法如下所示: @Override...在内部创建了消息队列,外界需要通过Handler的消息方式类通知HandlerThread执行一个具体的任务,HandlerThread一个具体的使用场景就是IntentService。...HandlerThread,然后使用它的Looper来构造一个Handler对象的mServiceHandler,这样通过mServiceHandler发送的消息最终都会在HandlerThread中执行
源码分析 本次源码分析将根据 HandlerThread的使用步骤讲解 若不熟悉,请务必看文章Android多线程:手把手教你使用HandlerThread HandlerThread的使用步骤有...类有2个构造方法 // 区别在于:设置当前线程的优先级参数,即可自定义设置 or 使用默认优先级 // 方式1....()中创建的mLooper对象 return mLooper; } 总结 在获得HandlerThread工作线程的Looper对象时存在一个同步的问题:只有当线程创建成功 &...HandlerThread有2种让当前线程退出消息循环的方法:quit() 、quitSafely() */ // 方式1:quit() // 特点:效率高,但线程不安全 public...因为你的鼓励是我写作的最大动力!
大家好,又见面了,我是你们的朋友全栈君。...= priority; } 这里有两个构造方法,一个 HandlerThread(String name),一个 HandlerThread(String name, int...run 方法中首先获取线程 id,然后就调用了 Looper.prepare 方法创建一个 Looper,接着调用了 Looper.myLooper 方法获取到了当前线程的 Looper。...如果在没调用 HandlerThread 的 start 方法开启线程前就调用 getLooper 方法就通过 wait 方法暂时先进入等待,等到 run 方法运行后再进行唤醒。...这两个方法有一个共同的特点就是:Looper 不再接收新的消息了,消息循环就此结束,此时通过 Handler 发送的消息也不会在放入消息杜队列了,因为消息队列已经退出了。
领取专属 10元无门槛券
手把手带您无忧上云