美文网首页
async task 注意地方

async task 注意地方

作者: sherlock221b | 来源:发表于2015-12-14 13:27 被阅读228次
    1. AsyncTask用的是线程池,线程不用就会放回池中. 有新的AsyncTask会取出已有线程,之后开始执行,这就是导致你有多个AsyncTask的原因

    2. AsyncTask对象不可重复使用,也就是说一个AsyncTask对象只能execute()一次,否则会有异常抛出"java.lang.IllegalStateException: Cannot execute task: the task is already running"

    3. 在doInBackground()中要检查isCancelled()的返回值,如果你的异步任务是可以取消的话。cancel()仅仅是给AsyncTask对象设置了一个标识位,当调用了cancel()后,发生的事情只有:AsyncTask对象的标识位变了,和doInBackground()执行完成后,onPostExecute()不会被回调了,而doInBackground()和 onProgressUpdate()还是会继续执行直到doInBackground()结束。所以要在doInBackground()中不断的检查 isCancellled()的返回值,当其返回true时就停止执行,特别是有循环的时候。如上面的例子,如果把读取数据的isCancelled() 检查去掉,图片还是会下载,进度也一直会走,只是最后图片不会放到UI上(因为onPostExecute()没被回调)!

    1. 取消 async task的 模版

    <pre>
    public class Task extends AsyncTask<Void, Void, Void>{

    @Override
    protected Void doInBackground(Void... path) {
    // Task被取消了,马上退出循环
    if(isCancelled()) return null;
    }

    @Override
    public void onProgressUpdate(File... files) {
    // Task被取消了,不再继续执行后面的代码

    if(isCancelled()) return;
    .........
    }
    }

    UI线程:

    // 保持对Task的引用

    private PhotoTask task;

    // 1,启动新的任务
    task = new PhotoTask();
    task.execute(path);

    // 2, 取消任务

    if (task != null && task.getStatus() == AsyncTask.Status.RUNNING) {
    task.cancel(true); // 如果Task还在运行,则先取消它
    }

    }
    }
    </pre>

    相关文章

      网友评论

          本文标题:async task 注意地方

          本文链接:https://www.haomeiwen.com/subject/cqruhttx.html