文章目录
- 前言
- 一、官方文档建议
- 二、替换方法
- 总结
前言
能点进来这篇文章咱们基本也就确定一个前提,AsyncTask被弃用后我们需要找一个新的东西来替换掉它
一、官方文档建议
This class was deprecated in API level 30.
Use the standard java.util.concurrent or Kotlin concurrency utilities instead.
这是AsyncTask在官方文档中的描述,文档中明确提到AsyncTask已经被弃用,推荐使用java.util.concurrent这个包中的相关类或者kotlin中的携程替代,携程怎么用外面写的太多了,这里就不提了,当然主要是我也没学kotlin捏。
java代码中本文中采用的方法是使用java.util.concurrent包下的ExecutorService。
二、替换方法
为了便于理解咱们就简单点说,ExecutorService这玩意我们可以理解成java线程池的一种实现方式,创建其实例就是创建了一个线程池,线程池是干啥的就不需要我说了对吧。
代码如下(示例):
/**
* Create by lundao
* on 2021.9.3
* use for:
*/
public class LocalThreadPools {
private static ExecutorService executorService;
public static synchronized ExecutorService getExectuorService() {
if ( executorService == null ) {
executorService = Executors.newFixedThreadPool(2);
}
return executorService;
}
public static void ShutdownLocalThreadPools(){
if (!executorService.isShutdown()) {
executorService.shutdownNow();
Log.i("ThreadPool","Thread Shut Down!");
}
}
}
这里我创建了一个工具类LocalThreadPools专门用来处理耗时操作,主要是因为我寻思了半天也不知道在mvvm的架构下如果将线程池交给activity管理的话我要怎么样传递实例(其实主要是觉得写一大堆实例的传递很麻烦),索性就直接做成一个工具类了,使用单例模式保证线程池对象的全局唯一。executorService = Executors.newFixedThreadPool(2);这一句是正儿八经的对线程池的创建,我们此处选择的是创建一个固定线程数目的线程池,线程数为2。全部的创建类型如下,请按照需求创建
1. newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
2. newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
3. newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
4. newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
后面那个ShutdownLocalThreadPools()方法是用来关闭线程池的,如果不停止线程池那么其中的线程会一直运行,这个方法一般我在活动销毁时重写一下onDestroy()丢进去。
完成了这个工具类我们的耗时操作处理起来就很轻松了:
public void insertCustomer(Customer... customers) {
//executorService为getExectuorService获取的对象
//具体命名请按照自身习惯进行
executorService.execute(new Runnable() {
@Override
public void run() {
//耗时操作
customerDao.insertCustomer(customers);
}
});
// new InsertAsyncTask(customerDao).execute(customers);
}
ExecutorService对象咱们一般调用execute或者submit方法,一般都选用execute,前者没有返回值,后者能返回一个值,具体的这里就不展开了,写多了反而容易让人搞晕,如果有需要可以自行百度查询。
run()中写耗时操作,然后就完事了,记得别忘了在依赖的activity中shutdown线程池(顺道一提,此处的shutdown并不是立即关闭线程池,而是不再接收任务且会等到当前队列中全部任务完成后再关闭)
总结
本文属于是对自己之前学过的没有系统记录的东西的一个总结,并不能保证完全正确,如果您在阅读过程中发现有什么问题请不吝指出,以免本人的错误对他人造成不良影响。