Android中的AsyncTask的工作原理

作者: 289346a467da | 来源:发表于2019-02-17 00:45 被阅读3次

    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

    相关文章

      网友评论

        本文标题:Android中的AsyncTask的工作原理

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