handlerthread

Android 多线程和线程池详解

孤人 提交于 2019-12-03 16:45:39
AsyncTask 使用 AsyncTask 需要继承 AsyncTask,重写 doInBackground 方法。 onPreExecute 运行在调度线程 doInBackground 运行在线程池中 onPostExecute / onProgressUpdate / onCancelled 运行在 UI 线程中。 原理 AsyncTask 内部有两个静态线程池 一个线程池 SERIAL_EXECUTOR 表示串行线程池,内部包含一个消息队列,用来保存任务、按顺序调度任务 一个 THREAD_POOL_EXECUTOR 用来执行任务,其线程数量是根据 CPU 核数计算的 一个跑在主线程的 Handler,把执行进度和执行结果的回调发送到主线程 这两个线程池和一个 Handler 都是静态的,实际上是所有的 AsyncTask 对象公用的 特点和缺陷 4.1之前版本需要在主线程完成初始化,现在的版本不需要初始化了 5.0以及之前 AsyncTask 对象必须在主线程创建,execute 方法必须在主线程调用,之后的版本无此限制,但是 onPreExecute 方法会在调度线程执行 一个 AsyncTask 只能执行一次,否则会报错 1.6之前是串行任务,1.6开始采用线程池处理任务,3.0开始又串行任务,但可以使用 executeOnExecutor 并行 一般会把

第11章 Android的线程和线程池

匿名 (未验证) 提交于 2019-12-02 23:55:01
除了Thread以外,在Android中可以扮演线程的角色还有很多,比如AsyncTask和IntentService,同时HandlerThread也是一种特殊的线程。 AsyncTask封装了线程池和Handler。HandlerThread是一种具有消息循环的线程,在它的内部可以使用Handler。IntentService是一个服务,IntentService内部采用HandlerThread来执行任务,当任务执行完毕后IntentService会自动退出。IntentService是一种服务,不容易被系统杀死从而可以尽量保证任务的执行,如果是一个后台线程,由于这个时候进程中没有活动的四大组件,那么这个进程的优先级就会降低,容易被系统杀死,这就是IntentService的优点。 从Android3.0开始系统要求网络访问必须在子线程执行,否则网络访问将会失败并抛出NetworkOnMainThreadException这个异常。 11.2.1 AsyncTask AsyncTask是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。 4个核心方法: onPreExecute() doInBackground(Params… params)在此方法中可以通过publishProgress方法来更新任务进度

线程、多线程与线程池基础

我的梦境 提交于 2019-12-02 18:32:36
先看几个概念: 线程:进程中负责程序执行的执行单元。一个进程中至少有一个线程。 多线程:解决多任务同时执行的需求,合理使用CPU资源。多线程的运行是根据CPU切换完成,如何切换由CPU决定,因此多线程运行具有不确定性。 线程池:基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。 如果对线程概念不清晰的话,不妨先看看 我是一个线程 这篇文章,拟人化的故事阐述线程的工作原理。 ● 线程 创建线程的两种方式: 一、继承Thread类,扩展线程。 class DemoThread extends Thread { @Override public void run () { super .run(); // Perform time-consuming operation... } } DemoThread t = new DemoThread(); t.start(); 继承Thread类,覆盖run()方法。 创建线程对象并用start()方法启动线程。 面试题 1)线程和进程有什么区别? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用

Android 第十四课——Handler Looper Message

江枫思渺然 提交于 2019-11-29 22:40:46
1、基础概念 1)android.os.Handler 2)主要接受子线程发送的数据, 并用此数据配合主线程更新UI. 3)应用程序一旦启动,Android UI 这个主线程的生命周期就开始了,然而,Android UI 线程并不是线程安全的,也就是说,更新UI只能在主线程中同步更新,子线程中异步操作是危险的。所以,项目中如果我们直接new Thread 内部去更改Android UI,往往会报错误如下: java.lang.RuntimeException: Can't create handler inside thread that has not called 为了避免错误发生,那么更新Android UI 必须在主线程中操作,具体如何操作呢?Handler就发挥了特的作用。Handler的使用同时也会带来许多相关的知识,下面一一讲解。 2、实例化 1)采用默认的方式 new Handler();项目中很少使用这种方式。如果他是主线程中运行的,那么这个handler对象内部绑定了一个Looper对象Looper.getMainLooper();Looper对象是用来干嘛的呢? Looper类是用来为一个线程开启一个消息循环。可以这样获取对应的线程:handler.getLooper().getThread()。默认情况下Android中新诞生的线程是没有开启消息循环的

第11章 Android的线程和线程池

落花浮王杯 提交于 2019-11-28 19:45:37
除了Thread以外,在Android中可以扮演线程的角色还有很多,比如AsyncTask和IntentService,同时HandlerThread也是一种特殊的线程。 AsyncTask封装了线程池和Handler。HandlerThread是一种具有消息循环的线程,在它的内部可以使用Handler。IntentService是一个服务,IntentService内部采用HandlerThread来执行任务,当任务执行完毕后IntentService会自动退出。IntentService是一种服务,不容易被系统杀死从而可以尽量保证任务的执行,如果是一个后台线程,由于这个时候进程中没有活动的四大组件,那么这个进程的优先级就会降低,容易被系统杀死,这就是IntentService的优点。 11.1 主线程和子线程 从Android3.0开始系统要求网络访问必须在子线程执行,否则网络访问将会失败并抛出NetworkOnMainThreadException这个异常。 11.2 Android中的线程形态 11.2.1 AsyncTask AsyncTask是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。 4个核心方法: onPreExecute() doInBackground(Params… params