开启多线程退出后终止异步任务
2016-08-22 09:57
369 查看
AsyncTask.cancel()的结束问题
实际项目中有这么一个问题,用户进入详情界面,那么我们就要网络加载数据并展现在UI上,这个加载用线程或者异步。这里就拿项目中统一用异步任务来获取网络数据把。
用户可能会有这么一个操作,它在一个商品(说说等)列表中,点击一个列表项,进入到相应的详情界面,这时候,我们会开启一个异步任务来获取网络数据,但是网络差的情况下, 用户可能就不愿意等了,立马按后退按钮回到列表,点击下一个别的列表项进入详情界面,发现加载太慢,又按后退键,如此反复,那么就导致此时有多个异步任务在执行,或者出现OOM问题,或者出现异步任务等待问题。
那么,作为开发者,我们对应的解决方案,便是在用户在详情界面按退出按钮退回到上一个界面的时候,把没有执行完的异步任务给结束掉。
------------------------------------------------------------------------------------------------------------------------------
现在我们发现了这个问题,又有了解决方案。那么就用代码来实现了。
那么 取消异步任务怎么做?
我一开始这样做,AsyncTask.cancel(true);
看下参数的定义:
@param mayInterruptIfRunning <tt>true</tt> if the thread executing this * task should be interrupted; otherwise, in-progress tasks are allowed * to complete.
1、如果是true,如果线程执行,则会被打断
2、如果是false,线程将会被运行执行完成
看到这,很显然,我们以为.cancel(true)就会结束掉我们开启的正在执行的异步任务
但是实际上并没有结束掉我们想要结束的异步任务~~
看了些别人对此的解释:
AsyncTask不会不考虑结果而直接结束一个线程。调用cancel()其实是给AsyncTask设置一个"canceled"状态。这取决于你去检查AsyncTask是否已经取消,之后决定是否终止你的操作。对于mayInterruptIfRunning——它所作的只是向运行中的线程发出interrupt()调用。在这种情况下,你的线程是不可中断的,也就不会终止该线程。
那么该如何结束线程呢?
可见.cancel()是给AsyncTask设置一个"canceled"的状态,那么想要终止异步任务,就需要在异步任务当中结束。
@Override public void onProgressUpdate(Integer... value) { // 判断是否被取消 if(isCancelled()) return; ......... } @Override protected Integer doInBackground(Void... mgs) { // Task被取消了,马上退出 if(isCancelled()) return null; ....... // Task被取消了,马上退出 if(isCancelled()) return null; } ...
另外结束异步任务的条件:
if(loadAsyncVedio!=null && !loadAsyncVedio.isCancelled() && loadAsyncVedio.getStatus() == AsyncTask.Status.RUNNING){ loadAsyncVedio.cancel(true); loadAsyncVedio = null; }
loadAsyncVedio(异步任务)
如此,便可以有效及时的结束异步任务
相关文章推荐
- spring+ActiveMQ+JMS+线程池实现简单的分布式,多线程,多任务的异步任务处理系统
- 多线程异步调度任务
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)
- 异步、多线程、任务、并行编程:选择合适的多线程模型
- 异步、多线程、任务、并行编程之一:选择合适的多线程模型
- Android 多线程----AsyncTask异步任务详解
- 13、Android的多线程与异步任务
- 控制多线程,开启、暂停、继续、终止(实例)
- Android AsyncTask 基本用法,参数和步骤理解,开启异步任务之旅
- iOS -- 进程/多线程/同步任务/异步任务/串行队列/并行队列(对比分析)
- Android 多线程----AsyncTask异步任务详解
- Android多线程编程-异步任务总结
- 异步或多线程支持一个任务执行完成
- 宇哥带你飞之Android多线程与异步任务--第二篇
- Android多线程异步任务,在主线程中回调
- 异步/多线程/任务/并行编程之一:如何选择合适的多线程模型?
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)
- Android中http请求加异步任务加判断是否开启网络并显示在listview上
- ios--进程/多线程/同步任务/异步任务/串行队列/并行队列(对比分析)
- Java多线程之异步任务——AsyncTask