zoukankan      html  css  js  c++  java
  • AsyncTask的新认识

    我也是参考下面两篇很有价值的文档,然后做一个总结的:

    http://blog.csdn.net/hitlion2008/article/details/7983449

    http://blog.csdn.net/mylzc/article/details/6784415

    最近主管让我看一下某个性能方面的问题,场景类似于一个weibo页,外层weibo列表加载很多图片并不是很卡,但是进入单个weibo,评论列表里面滑动有时就会卡顿。缓存方面原本已经做好,那究竟是为什么呢?

    想到的主要原因:列表页同一时间相对图片需要下载的并不是很多,评论页的话都是小图片,屏幕里可见区域里需要下载的图片较多,所以会卡顿。

    找了一个下午,发现了上面这两篇文章,在API10(包括10)之后AsycnTask的实现有了大变化。10之前默认是最多5个线程运行,超过5个的就要等待。google在之后意识到了这个问题,增加了一个executeOnExecutor的方法,可以自定义线程池来运行和调度Thread。原来的execute方法到了api10之后默认就是按提交的次序,每次只启动一个线程执行一个任务,完成之后再执行第二个任务,也就是相当于只有一个后台线程在执行所提交的任务(Executors.newSingleThreadPool())。然后改为根据api版本号来分别调用前者或者executeOnExecuteor方法,并传入自己定义的Executor

    private static final int CORE_POOL_SIZE = 5;
    private static final int MAXIMUM_POOL_SIZE = 128;
    private static final int KEEP_ALIVE = 1;
    
    private static final BlockingQueue<Runnable> sPoolWorkQueue =
                new LinkedBlockingQueue<Runnable>(10);
    
        /**
         * An {@link Executor} that can be used to execute tasks in parallel.
         */
    public static final Executor THREAD_POOL_EXECUTOR
                = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
                        TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);

    可以在executeOnExecuteor根据自己要求第一个参数传入

    new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
    TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory),这样的话可以自己控制并行最多几个线程运行,缓冲队列有多大,缓冲队列也满后可以做多开多少线程。

    通过这么修改后发现图片加载很快,而且在老的android机器上测试也不会有何问题。

    疑问:

    1.文章中说:executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)就跟2.3版本的AsyncTask.execute()效果是一样的

    我感觉还是不太一样。

    2.上面桔黄色部分,我看了source,感觉还是用了默认5个线程的THREAD_POOL_EXECUTOR而并不是1个的newSingleThreadPool。

  • 相关阅读:
    win10 系统下myeclipse 下启动 tomcat7 所遇到的问题
    搭建个人博客&论坛(LAMP):wordpress、discuz、phpMyAdmin
    拟合优度检验和独立性检验
    作业day19
    numpy
    正则模块
    模块功能
    模块
    匿名函数、异常处理
    递归和迭代器
  • 原文地址:https://www.cnblogs.com/cqcmdwym/p/3280608.html
Copyright © 2011-2022 走看看