Android中的AsyncTask的工作原理

Android中的线程机制是非常重要的,在很多情况下为了使APP不卡顿,我们需要将很多事情放到子线程中执行,使主线程尽量没有耗时操作,否则会导致ANR.Android中的线程几乎完全采用了Java中的线程机制,那么创建、销毁、调度线程对线程的了解就很重要了.

Runnable/Callable

如何创建一个线程我相信只要做过Java的都会创建.这里就简单介绍一下.

new Thread(){
            @Override
            public void run() {
                super.run();
            }
        };
        
        new Thread(new Runnable() {
            @Override
            public void run() {
                
            }
        });

需要注意的是
Runnable 和 Callable,它们两个都是线程中执行的任务,主要区别是Callable可以在任务完成时能够返回一个值,Callable 可以返回装载有计算结果的 Future 对象.它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过 Future 对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果;Runnable是执行工作的独立任务,它不返回任何值.
Thread类只支持Runnable接口,只有线程池支持Callable
下面我们通过一个例子,看一下Callable

private static void callable() {
        ExecutorService executorService = Executors.newCachedThreadPool();
        List<Future<String>> futureList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            //submit 会产生Future对象 它用Callable返回的结果的特定类型进行了参数化
            //可以用future.isDone来查询future是否已经完成 直接调用future.get可能会阻塞 知道结果准备就绪
            futureList.add(executorService.submit(new TaskWithResult(i)));
        }
        for (Future<String> future : futureList) {
            try {
                if (future.isDone()) {
                    System.out.println(future.get());
                }
            } catch (InterruptedException | ExecutionException e) {
                System.out.println(e);
            } finally {
                executorService.shutdown();
            }
        }
    }
    
public class TaskWithResult implements Callable<String> {

    private int id;

    public TaskWithResult(int id) {
        this.id = id;
    }

    @Override
    public String call() throws Exception {
        return "TaskWithResult is id:" + id;
    }
}

Thread 也可以实现这种方式,FutureTask.

为了更好的阅读体验,阅读全文:https://www.jakeprim.cn/2019/02/17/asyncTask/#more

    原文作者:JakePrim
    原文地址: https://www.jianshu.com/p/75826e72621d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞