zoukankan      html  css  js  c++  java
  • 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(异步任务)

    如此,便可以有效及时的结束异步任务

  • 相关阅读:
    02安卓用户界面优化之(三)如何使用菜单
    07-业务敏捷:帮助DevOps快速落地的源动力
    转型之路:企业实施DevOps的常见路径和问题
    价值流分析:关于DevOps转型,我们应该从何处入手
    DevOps的衡量:你是否找到了DevOps的实施路线图
    DevOps的实施:到底是工具先行还是文化先行
    DevOps的价值:数字化转型时代,DevOps是必选项
    DevOps的“定义”:DevOps究竟要解决什么问题
    Jenkins产品经理是如何设计产品的
    关于DevOps组织和文化的那些趣事儿.
  • 原文地址:https://www.cnblogs.com/xqxacm/p/5227159.html
Copyright © 2011-2022 走看看