【Android】在不同的线程池中执行AsyncTask
来源:互联网 发布:mysql if then else 编辑:程序博客网 时间:2024/05/29 04:12
说起AsyncTask,有过Android开发经历的人应该都很熟悉,这是我们异步执行耗时操作的一个利器。
在一般情况下,如果有若干通过execute()方法执行的AsyncTask对象,这些的对象的异步操作会按顺序一个一个执行。这是因为使用execute方法的AsyncTask,会默认调用一个static的线程池变量THREAD_POOL_EXECUTOR进行管理。该线程池保证了各AsyncTask执行时的时序,即一次执行一个,先进先出。
(如果想要更加深入的了解AsyncTask的工作原理,推荐博文:Android应用AsyncTask处理机制详解及源码分析
在这种情况下,可能会遇到以下问题:
比如类似新浪微博的应用, 进入首页时启动了N个AsyncTask,来从网络加载首页所需要的图片。在首页的图片没有全部加载成功之前,点进某一条微博查看详细内容,同样使用了AsyncTask加载图片。这个时候我们可能会等待非常久的时间才能看到图片,因为需要等首页的那N个AsyncTask执行完,才会执行详细页面的AsyncTask。这样就可能造成很不好的体验。这种情况下,我们可能需要让首页和详细页面的AsyncTask在不同的线程池中执行,以避免这种在同一个默认线程池中执行导致出现的等待现象。
如果要在非默认的线程池(THREAD_POOL_EXECUTOR)中执行AsyncTask,则需要使用excuteOnExecutor方法代替execute, 因为该方法中允许我们传入自己定义的线程池。
Java通过Executors类的四个方法,分别提供了4种不同的线程池。
newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
(以上对四种方法的简介摘自Trinea: 介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用)
如果想让AsyncTask在不同的线程中执行,同时一个线程池中的AsyncTask依然一个一个执行,则可以选用singleThreadExecutor。
示例代码:
ExecutorService loadExecutor = Executors.newSingleThreadExecutor();LoadSmallPicTask task = new LoadSmallPicTask(photoUrl);task.executeOnExecutor(loadExecutor);
在其他几种线程池中执行AsyncTask的方法跟上面相同。
- 【Android】在不同的线程池中执行AsyncTask
- android AsyncTask的方法在哪几个线程中调用
- 安卓(Android)中如何优雅的 创建/执行 异步任务/回调(AsyncTask 、Thread、Job、CallBack、Handler) ?线程池(Executor)
- Android中AsyncTask的依赖执行用法
- Android中AsyncTask的执行过程
- AsyncTask Android的线程和线程池
- 在Android Service中使用AsyncTask执行任务
- 在Android UI线程中执行定时任务的方法
- Android中AsyncTask(异步执行任务)的使用
- AsyncTask 的线程池
- Android 的线程(AsyncTask、HandlerThread、IntentService详解)和线程池
- Android 的线程(AsyncTask、IntentService详解)和线程池
- Android 的线程(AsyncTask、HandlerThread、IntentService详解)和线程池
- Android AsyncTask中后台线程堵塞的原因分析
- Android 不可缺少的异步(Thread、Handler、AsyncTask)实例解析(在独立线程中进行地理位置编码)
- Android 中执行异步操作 AsyncTask实现。
- AsyncTask---详解Android中AsyncTask的使用
- 【AsyncTask】详解Android中AsyncTask的使用
- GTK简单版计算器
- TextView 支持自定义字体和属性
- Struts2与servlet共存的解决方案
- SQLite 运算符
- 26 - 复杂链表的复制
- 【Android】在不同的线程池中执行AsyncTask
- Jsp中图片显示问题以及显示绝对路径图片问题
- vs2010运行mat文件的一个测试代码
- USACO 4.2.2The Perfect Stall 完美的牛栏(二分图最大匹配)
- linux下安装tomcat并设置开机自启动
- Android中获取应用程序(包)的信息-----PackageManager的使用(一)
- 公告栏无间隙滚动
- listview根据touch的坐票来确定获取点击的item view
- Linux vmstat 命令详解