首页 > 编程知识 正文

HandlerThread详解

时间:2023-05-04 00:15:27 阅读:75877 作者:1548

请转载链接:https://blog.csdn.net/feather _ wch/article/details/82556153

handler趋势科技版本: 2018/9/9-1(10:10 )。

HandlerThread问题总结基本使用(7)源代码)7)

问题总结了所有与HandlerThread相关的可能问题,用于自检测和遗漏补充。 【】标记的是补充问题,直接给出回答。 剩下的问题的答案都在文中。 什么是HandlerThread?

【】HandlerThread任务是否并行处理?

不! 正在进行串行处理。 如果一个任务的执行时间太长,后续任务将被阻止。

【】HandlerThread不能执行耗时的任务吗?

内部任务按串行处理。 如果一个任务的执行时间太长,后续任务将被阻止。

【】如何在HandlerThread上执行具体任务?

需要从外部通过Hanlder的消息方式通知HandlerThread来执行具体的任务

HandlerThread诞生的背景是什么?

HandlerThread怎么退出? HandlerThread的典型使用场景是什么? HandlerThread的基本使用流程是? HandlerThread怎么让一个线程一直运行,有新任务就处理,没有任务就等? handlerThread.getLooper ()是否必须在handlerThread.start ) )之后调用? HandlerThread的制作方法HandlerThread的run ()做了什么? HandlerThread怎么退出? quit/quit或quitSafelyHandlerThread的Tid有什么用? 为什么run有通告全部,getLooper有等待? 为什么要设置线程的优先级? 为什么可以防止内存泄漏并解决数据安全问题? 设置线程优先级的两种方法? 两种方式的优先范围是? 基本(7) 1、使用HandlerThread的是什么?

内置Looper、Handler和消息队列的Thread内部有队列,任务进行串行处理。 (如果一个任务的执行时间过长,将阻止后续任务。 )执行任务:是否需要通过Hanlder消息通知HandlerThread来执行特定任务2,HandlerThread生成的背景?

线程通常在运行任务时停止。 由于有很多任务而频繁创建和销毁线程会消耗系统资源。 如果子线程需要更新UI,则要使用到处理程序,还需要创建Looper等操作,非常繁琐。 3、汉德雷怎么退出?

HandlerThread的run方法必须在无限循环中运行,并且HandlerThread的quit或quitSafely方法必须结束线程的运行4,HandlerThread的典型使用场景是什么?

HandlerThread的典型使用场景是IntentService 5、HandlerThread的基本使用

/* *======================handler thread *===============/*=====================================tlooper ) ) @ overridepublicvoidhandlemessage (message msg ) )//此方法在handler-thread线程上运行,并且需要很长时间才能完成操作log.d () ;/*==========================执行打开任务*=============

利用了Looper.loop()进行无限循环。

7、handlerThread.getLooper()必须在handlerThread.start()之后调用

不然因为isAlive() = true,会导致直接返回null。无法去构造Handler Handler handler = new Handler(handlerThread.getLooper());// java.lang.NullPointerException: Attempt to read from field 'android.os.MessageQueue android.os.Looper.mQueue' on a null object reference 源码(7)

1、HandlerThread的构造方法

默认的线程优先级为:THREAD_PRIORITY_DEFAULT,标准的app线程优先级可以自定义线程优先级 // HandlerThread.java public HandlerThread(String name) { super(name); mPriority = Process.THREAD_PRIORITY_DEFAULT; } public HandlerThread(String name, int priority) { super(name); mPriority = priority; }

2、HandlerThread的run()

获取Tid,设置优先级,创建Looper回调 onLooperPrepared(),并开启loop()getLooper()获取Looper时,会阻塞调用者线程,直到HandlerThread创建了Looper。 // HandlerThread.java-线程的run方法 @Override public void run() { // 1、获取到Tid mTid = Process.myTid(); // 2、创建Looper、MessageQueue Looper.prepare(); synchronized (this) { // 3、存储,并唤醒从HandlerThread.getLooper()方法而阻塞的线程 mLooper = Looper.myLooper(); notifyAll(); } // 4、设置线程优先级 Process.setThreadPriority(mPriority); // 5、回调,进行loop前的准备工作。 onLooperPrepared(); // 6、开始loop() Looper.loop(); mTid = -1; } // HandlerThread.java-loop()前的准备工作 protected void onLooperPrepared() { } // HandlerThread.java-获取到该线程的Looper public Looper getLooper() { // 1、不存活,直接返回null if (!isAlive()) { return null; } // 2、在looper创建前,处于阻塞状态。 synchronized (this) { while (isAlive() && mLooper == null) { try { wait(); } catch (InterruptedException e) { } } } return mLooper; } //@hide: 获取Handler或者用调用者线程的looper创建Handler public Handler getThreadHandler() { if (mHandler == null) { mHandler = new Handler(getLooper()); } return mHandler; }

3、HandlerThread如何退出?quit/quit或quitSafely

调用Looper的退出方法。 // 通过Looper的quit和quitSafely进行退出。 public boolean quit() {} public boolean quitSafely() {}

4、HandlerThread的Tid有什么用?

Thread id,就是线程的ID,表明线程的身份 // 1、获取到TidmTid = Process.myTid();public int getThreadId() { //2、返回Tid return mTid;}

5、为什么run中有notifyAll,getLooper中有wait?

避免线程同步问题导致Looper为null在getLooper()调用时,可能run()方法中Looper还没有创建成功,此时返回Looper会出现问题。因此需要去wait。run()中Looper一旦创建好,就可以去notifyAll()让getLooper()可以返回正确的Looper

6、为什么要设置线程优先级?为什么能防止内存泄漏和解决数据安全问题?

线程优先级主要分为UI线程和后台线程(backgorund)线程默认优先级为default,也就是UI线程,会和UI线程去平等的争抢资源。在UI性能要求较高的场景下,应该使用后台线程。

7、线程优先级设置的两种方法?两种方式的优先级范围?

1-setThreadPriority()进行设置,线程优先级范围-20~19, 从高优先级~低优先级。

android.os.Process.setThreadPriority (intpriority);android.os.Process.setThreadPriority (inttid, int priority);// thread直接设置Thread a = new MyThread("ThreadA");a.setOSPriority(Process.THREAD_PRIORITY_LOWEST);// 19// thread的run方法中进行设置Thread b = new Thread(new Runnable() { @Override public void run() { Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST); }});

2-setPriority()设置,线程优先级范围1~10, 从低优先级~高优先级。

java.lang.Thread.setPriority (int priority);// setPriority进行设置Thread a = new MyThread("ThreadA");a.setPriority(Thread.MAX_PRIORITY);// 10

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。