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

    Android Handler机制11之Handler机制总结

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

    2.7K10

    详解 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,也可以适用于其他的线程。

    75950

    安卓handler源码(androidstudio源码)

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

    46230

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

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

    1.3K31

    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。

    56270

    HandlerThread 源码分析

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

    25620

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

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

    22810

    总结--3

    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(

    37120

    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

    29610

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

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

    2.3K20

    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,而

    5.2K63

    关于Android中工作者线程的思考

    然而在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

    75620

    Android多线程介绍

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

    55050

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

    在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中执行

    35520
    领券