Android常用多线程
ThreadPoolExecutor
CachedThreadPool
只有非核心线程,且总线程数量不固定,当任务到来时,有空闲线程,就立即交由该线程去处理任务,否则就立即创建新线程去处理该任务,保证第一时间执行任务。但空闲线程有超时机制,空闲超过60秒,就会被系统回收。适合执行量大耗时少的任务。
FixThreadPool
只有核心线程,并且数量固定的,也不会被回收。当所有线程都活动时,因为队列没有限制大小,新任务会等待执行。由于线程不会回收,FixThreadPool会更快地响应外界请求。
SingleThreadPool
只有一个核心线程,能够确保所有任务都在同一线程中按顺序完成。因此不需要处理线程同步的问题。
ScheduledThreadPool
拥有固定数量核心线程数量和不固定的非核心线程数量的线程池,4个里面唯一一个有延迟执行和周期重复执行的线程池。
使用方式(以newCachedThreadPool举例)
ExecutorService executo = Executors.newCachedThreadPool();
executor1.execute(new Runnable() {@Overridepublic void run() {......}
});
AsyncTask
// 1.doInBackground方法中参数的类型
// 2.onProgressUpdate方法参数的类型
// 3.doInBackground方法的返回值类型,也是onPostExecute方法的参数的类型
class LoadDataAsyncTask extends AsyncTask<String, Integer, List<Integer>>{// 运行在UI线程,且在doInBackground方法运行前执行@Overrideprotected void onPreExecute() {super.onPreExecute();}// 在子线程中执行,且方法的执行结果会作为参数传入onPostExecute方法中@Overrideprotected List<Integer> doInBackground(String... strings) {List<Integer> a = new ArrayList<>();return a;}@Overrideprotected void onProgressUpdate(Integer... values) {super.onProgressUpdate(values);}// 运行在UI线程,且在doInBackground方法运行结束后执行@Overrideprotected void onPostExecute(List<Integer> list) {super.onPostExecute(list);}
}
调用方式
LoadDataAsyncTask task = new LoadDataAsyncTask();
String param = "qqqq";
// 这个方法通常和THREAD_POOL_EXECUTOR一起使用,允许多个任务在线程池中异步并发执行
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, param);
// execute方法实际内部调用的是executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, params)
// 把多个线程按串行的方式执行,所以是同步执行的,也就是说,只有当一个线程执行完毕之后,才会执行下个线程。
task.execute(param);
Handler
Handler是一套 Android 消息传递机制 / 异步通信机制。
- 为什么要用 Handler消息传递机制
答:多个线程并发更新UI的同时 保证线程安全。
背景:在Android开发中为了UI操作是线程安全的,规定只允许UI线程里操作UI组件。
冲突:在实际操作开发中,存在多个线程并发操作UI组件的情况,因而会导致UI操作的线程不安全。
需求:因为上面的冲突产生新的需求,多个线程既可以并发操作UI组件,又能保证线程安全。
解决方案:Handler消息传递机制,即工作线程需要通知UI时,全部通过Handler通知主线程,从而在主线程操作UI。
所以,Handler就是在多线程的应用场景中,将工作线程中需更新UI的操作信息传递到UI主线程,使得主线程可根据工作线程的需求更新UI,从而实现工作线程对UI的更新处理,并避免线程操作不安全的问题,最终实现异步消息的处理。
使用方式
1、在主线程中创建Handler实例。
2、通过两种方式通知UI线程:Handler.sendMessage()、Handler.post()。这两种方式实质都是通过调用sendMessageDelayed(@NonNull Message msg, long delayMillis)来实现的。
sendMessage方式
Handler handler = new Handler(Looper.myLooper()) {@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);switch (msg.what) {case 111:}}
};
Message message = new Message();
message.what = 111;
message.obj = new Date();
handler.sendMessage(message);
post方式
Handler handler = new Handler(Looper.myLooper());
handler.post(new Runnable() {@Overridepublic void run() {}
});
Handler还可以用来延迟执行任务。
Android常用多线程相关推荐
- Android常用面试题大全
1.TCP和UDP之间的区别?什么是URL ? TCP被称为用户数据报协议;UDP被称为信息传输控制协议;URL被称为统一资源定位符,通过统一资源定位符可以唯一定位到互联网上的某个资源(图片.视频.音 ...
- android 常用框架整理
文章目录 UI 框架 WebView 框架 具体内容 UI 卫星菜单 节选器 下拉刷新 模糊效果 HUD与Toast 进度条 UI其他 动画 网络相关 网络连接 网络测试 图像获取 响应式编程 地图 ...
- Android 常用开源总结
Android 常用开源库总结 引自 http://www.apkbus.com/blog-977630-79771.html Tag: 前言 收集了一些比较常见的开源库,特此记录(已收录350+) ...
- Android面试题大全,2021最新Android常用开源库总结
Broadcast Receiver面试题 1.Broadcast Receiver是什么 Broadcast是四大组件之一,是一种广泛运用在应用程序之间传输信息的机制,通过发送Intent来传送我们 ...
- Android常用酷炫控件(开源项目)github地址汇总
转载一个很牛逼的控件收集帖... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.Gri ...
- 9款Android常用的快速开发框架
9款Android常用的快速开发框架 Android 2015-08-24 11:05:08 发布 您的评价: 0.0 收藏 0收藏 1.Afinal框架 项目地址:https ...
- Android常用面向对象设计模式
对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次.而在android开发中,必要的了解一些设计模式又是必须的,因为设计模式在Android源码 ...
- android开发获取应用本身耗电量_别找了,Android常用自动化工具全在这儿了!
Android常用自动化工具 ADB - 是Google提供的为Android编写UI测试用例的自动化工具, Android开发/测试人员不可替代的强大工具 uiautomator - 是Google ...
- Android之多线程工作-AsyncTask与handler
本文主要讲解下AsyncTask的使用以及Handler的应用 首先,我们得明确下一个概念,什么是UI线程.顾名思义,ui线程就是管理着用户界面的那个线程! android的ui线程操作并不是安全的, ...
最新文章
- java TreeMap用法
- Java各种数据类型详细介绍及其区别
- 用python计算ln函数_python-含参函数
- 神经网络中的 Dropout 以及变体方法
- 商务英语计算机,BEC商务英语
- Method for Discovering Network Topology中文翻译【Z-Stack Home 1.2.0开发文档】
- 20155225 2006-2007-2 《Java程序设计》第四周学习总结
- vue获取table一列数据_vue中比较重要的小知识点
- Spring学习总结(1)- IOC
- 张正友标定法matlab,张正友标定法(相机标定)
- CSS 深入理解absolute
- 何为血缘分析?血缘分析能给我们带来什么影响?
- antdownload百度网盘下载器、下载不限速
- 数字后端——信号完整性分析
- 榆熙电商:在拼多多开网店如何计算产品价格弹性区间?
- mysql 5.7.22 winx64_MySQL 5.7.22 winx64 安装配置方法图文教程
- 实时高分辨率视频抠像
- iOS设计:绘图及性能
- php realpath 缓存,PHP的Realpath Cache
- 【ML】Mean-Shift 原理 + 实践(基于sklearn)
热门文章
- 又有大厂员工连续加班倒下/ 百度搜狗取消快照/ 马斯克生父不为他骄傲...今日更多新鲜事在此...
- 【技术】nuxt中引入wow和animate.css随页面滚动出现动画
- 2022年10月29日 20点 程序爱生活 纳指和恒指可能会小破前高,然后有概率继续破新低,但是破完就需要考虑一次较大级别反弹的概率了! 第一次不再完全看空!
- 银行数据中台的数据价值,银行数据中台建设实践案例
- python队列get不到数据_Python队列.get(block=true)添加项时不返回超时
- 吃鸡 python开发_python青少年编程第三季——14、吃鸡联盟之亚瑟开枪(上)
- 手游显示服务器繁忙,吃鸡显示一个错误然后就服务器繁忙 | 手游网游页游攻略大全...
- python脚本编写bat_推荐10个关于BAT脚本的实例教程
- 微信支付宝刷脸支付积极助力行业效率提升
- 游戏外挂开发系列--游戏喊话器