android多线程

Android 多线程----AsyncTask异步任务详解

夙愿已清 提交于 2020-02-29 08:48:04
【声明】 欢迎转载,但请保留文章原始出处→_→ 生命壹号: http://www.cnblogs.com/smyhvae/ 文章来源: http://www.cnblogs.com/smyhvae/p/3866570.html 【正文】 本文将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信。 一、Android当中的多线程: 在Android当中,当一个应用程序的组件启动的时候,并且没有其他的应用程序组件在运行时,Android系统就会为该应用程序组件开辟一个新的线程来执行。默认的情况下,在一个相同Android应用程序当中,里面的组件都是运行在同一个线程里的,这个线程称之为Main线程。当我们通过某个组件来启动另一个组件的时候,这个时候默认都是在同一个线程当中完成的。当然,我们可以自己来管理我们的Android应用的线程,我们可以根据我们自己的需要来给应用程序创建额外的线程。 二、Main Thread 和 Worker Thread: 在Android当中,通常将线程分为两种,一种叫做Main Thread,除了Main Thread之外的线程都可称为Worker Thread。 当一个应用程序运行的时候,Android操作系统就会给该应用程序启动一个线程,这个线程就是我们的Main Thread,这个线程非常重要

多线程(四)、Android多线程使用及AsyncTask源码分析

半城伤御伤魂 提交于 2020-01-01 00:59:19
本篇是多线程系列的第四篇,如果对前三篇感兴趣的也可以去看看。 多线程(一)、基础概念及notify()和wait()的使用 多线程(二)、内置锁 synchronized 多线程(三)、线程池 ThreadPoolExecutor 知识点总结 除了前面的线程池的使用外,在Android中,我们除了通过 Thread 创建线程外,还可以通过 AsyncTask 、 IntentService 、 HandleThread 来创建,线程池前面一篇已经详细介绍了,下面对其他几个方法简单的介绍。 1.1、HandleThread 1.1.1、源码 public class HandlerThread extends Thread { int mPriority; int mTid = - 1 ; Looper mLooper; public HandlerThread (String name) { super (name); mPriority = Process.THREAD_PRIORITY_DEFAULT; } public HandlerThread (String name, int priority) { super (name); mPriority = priority; } protected void onLooperPrepared () { } @Override

Android多线程的四种方式

北城以北 提交于 2019-12-23 10:00:07
转自: https://www.jianshu.com/p/91552325f5a5 当我们启动一个App的时候,Android系统会启动一个Linux Process,该Process包含一个Thread,称为UI Thread或Main Thread。通常一个应用的所有组件都运行在这一个Process中,当然,你可以通过修改四大组件在Manifest.xml中的代码块()中的android:process属性指定其运行在不同的process中。当一个组件在启动的时候,如果该process已经存在了,那么该组件就直接通过这个process被启动起来,并且运行在这个process的UI Thread中。 UI Thread中运行着许多重要的逻辑,如系统事件处理,用户输入事件处理,UI绘制,Service,Alarm等,如下图: UI Thread包含的逻辑 而我们编写的代码则是穿插在这些逻辑中间,比如对用户触摸事件的检测和响应,对用户输入的处理,自定义View的绘制等。如果我们插入的代码比价耗时,如网络请求或数据库读取,就会阻塞UI线程其他逻辑的执行,从而导致界面卡顿。如果卡顿时间超过5秒,系统就会报ANR错误。所以,如果要执行耗时的操作,我们需要另起线程执行。 在新线程执行完耗时的逻辑后,往往需要将结果反馈给界面,进行UI更新。Android的UI toolkit不是线程安全的

Android多线程——View.post()源码分析

99封情书 提交于 2019-12-06 14:37:56
提起View.post()或者View.postDelay(),相信不少童鞋一点都不陌生,它用得最多的有两个功能 1)在子线程中更新UI; 2)获取View的宽高等属性值。 一、在子线程中更新UI 一般我们通过使用View.post()实现在子线程中更新UI的示例大致如下: 1 private Button mStartBtn; 2 @Override 3 protected void onCreate(Bundle savedInstanceState) { 4 super.onCreate(savedInstanceState); 5 setContentView(R.layout.activity_intent_service); 6 mStartBtn = findViewById(R.id.start); 7 new Thread(new Runnable() { 8 @Override 9 public void run() { 10 mStartBtn.post(new Runnable() { 11 @Override 12 public void run() { 13 //处理一些耗时操作 14 mStartBtn.setText("end"); 15 } 16 }); 17 } 18 }).start(); 19 } 第7行开启了一个线程

Android 多线程和线程池详解

£可爱£侵袭症+ 提交于 2019-12-06 07:47:51
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 并行 一般会把

Handler与Android多线程

浪子不回头ぞ 提交于 2019-12-05 12:57:42
下面是一段大家都比较熟悉的代码: Handler handler = new Handler(); handler.post(myThread); //使用匿名内部类创建一个线程myThread Runnable mythread = new Runnable() { public void run() { } }; 一开始,相信很多人都以为myThread中的run()方法会在一个新的线程中运行,但事实并非如此。 上述代码中的handler并没有调用线程myThread的start()方法,而是直接调用了run()方法,这也就意味着实际上并没有创建一个新的线程,只是在当前线程中调用run()方法而已。 这牵扯出一个问题,如果我们将一个很耗时的操作放到了run()方法内,然后使用一个Handler对象将该线程post到线程队列。原本我们希望将这些耗时操作放到另外一个线程中,以免影响当前进程。但实际上却恰恰相反:post()以下的那些代码必须等到run()方法执行完毕后才能继续执行。如当前线程为主线程,那么主程序便会处于硬直状态。 那么应该如何去实现真正的多线程呢? 一种最简便的方法就是直接利用JAVA中的实现多线程的方法,即建立一个Thread对象,然后调用start()方法。 还有另外一种方法,代码如下: //HandlerThread建立了一个新线程,它包含一个Looper

Android多线程操作——线程池管理综述

邮差的信 提交于 2019-12-04 18:45:51
题记—— 难过了,悄悄走一走; 伤心了,默默睡一觉; 优雅不是训练出来的,而是一种阅历; 淡然不是伪装出来的,而是一种沉淀; 时间飞逝,老去的只是我们的容颜; 时间仿佛一颗灵魂,越来越动人; 其他站点: 1、回享每一时刻 http://jingyan.baidu.com/article/25648fc193fcbe9190fd004f.html 2、回眸每一点钟 http://blog.csdn.net/zl18603543572/article/details/52012122 1、简述: 在多线程的世界中,是那么的神奇 与 高效以及合理; 2、创建线程池实例 官方推荐使用Executors类工厂方法来创建线程池管理,Executors类是官方提供的一个工厂类,里面封装了好多功能不一样的线程池,从而使得我们创建线程池非常的简单: 3、使用线程池来管理任务 4、Executors核心创建说明 可以看到1 - 3 创建线程池的方法中,全部是创建了ThreadPoolExecutor这个对象实例,不同的只是构造中的参数不一至,而在4 与5 ,从其继承的角度来看 public class ScheduledThreadPoolExecutor extends ThreadPoolExecutor implements ScheduledExecutorService {

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 并行 一般会把

Android 当中的多线程之 wait、sleep、notify、join、yield

匿名 (未验证) 提交于 2019-12-03 00:37:01
Android 当中的多线程实际上就是 Java SE 中的多线程,只是为了方便使用,Android 封装了一些类,比如 AsyncTask, HandlerThread等。今天我们总结一下 Android 当中的多线程基础知识。 对于 Android 多线程,我们最早学习到的都是 Thread 和 Runnable ,通常我们使用如下代码来开启一个新的线程: public void startNewThread () { new Thread(){ @Override public void run () { super .run(); // 执行耗时操作 } }.start(); } 或者是 public void startNewThreadWithRunnable () { new Thread( new Runnable() { @Override public void run () { // 执行耗时操作 } }).start(); } 实际上这两种写法的差别不大,那么 Thread 和 Runnable 有什么区别呢? 实际上 Thread 也是一个 Runnable,它实现了 Runnable 接口,内部包含了一个 Runnable 类型的 target 表示要在这个子线程执行的操作 public class Thread implements Runnable

Android多线程任务优化1:探讨AsyncTask的缺陷

懵懂的女人 提交于 2019-12-01 21:58:04
导语 :在开发Android应用的过程中,我们需要时刻注意保障应用的稳定性和界面响应性,因为不稳定或者响应速度慢的应用将会给用户带来非常差的交互体验。在越来越讲究用户体验的大环境下,用户也许会因为应用的一次Force Close(简称FC)或者延迟严重的动画效果而卸载你的应用。由于现在的应用大多需要异步连接网络,本系列文章就以构建网络应用为例,从稳定性和响应性两个角度分析多线程网络任务的性能优化方法。 概述 :为了不阻塞UI线程(亦称主线程),提高应用的响应性,我们经常会使用新开线程的方式,异步处理那些导致阻塞的任务(如要了解Android异步处理的实现方式和原理,请先阅读 《Android异步处理系列文章索引》 )。 AsyncTask是Android为我们提供的方便编写异步任务的工具类,但是,在了解AsyncTask的实现原理之后,发现AsyncTask并不能满足我们所有的需求,使用不当还有可能导致应用FC。 本文主要通过分析AsyncTask提交任务的策略和一个具体的例子,说明AsyncTask的不足之处,至于解决办法,我们将在下篇再讲解。 分析 : AsyncTask类包含一个全局静态的线程池,线程池的配置参数如下: private static final int CORE_POOL_SIZE =5;//5个核心工作线程 private static final int