zoukankan      html  css  js  c++  java
  • AsyncTask执行顺序

    这几天,遇见个奇葩问题,记录一下。

    在用AsyncTask的时候,new 出来的AsyncTask总是等了很久才执行到。

    于是乎,想到了是不是前面已经有好几个AsyncTask的实例了,是不是线程优先级的问题呢?

    在了解了以下知识后,发现AsyncTask默认总是先后执行的,除非调用AsyncTask.executeOnExecutor才是并发执行,不过此方法可能造成数据混乱,但是我的AsyncTask本来就是有先后顺序,而且有标示,所以以应该不会出现混乱的状况。

    Notes:

      1:

      因为AsyncTask里面的内部handler和Executor都是静态变量,所以,他们控制着所有的子类。

      2:

      我们可以通过AsyncTask.execute()方法来调用系统默认的线程池来处理当前的任务,

      系统默认的线程池用的是SerialExecutor.这个线程池控制所有任务按顺序执行。也就是一次只执行一条.

      当前执行完了,才执行下一条.2.3平台以前是所有的任务并发执行,这会导致一种情况,就是其中一条任务执行出问题了,会引起其他任务出现错误.

      3:

      AsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)你也可以采用这个系统提供的线程池来处理你的任务

      默认这个线程池是并发处理任务的,也就是不按顺序来.核心为5条,最大128条

      4:

      你也可以使用自定义的线程池,这样就可以即使的执行你的任务需求,而不是用系统的。因为用系统默认的线程池可以需要等待,它默认是按顺序执行(THREAD_POOL_EXECUTOR)或者最多执行5个(SerialExecutor).

      自己使用自定义线程池方式如下:

      new AsyncTask.executeOnExecutor((ExecutorService)Executors.newCachedThreadPool()).

      5:  不要随意使用AsyncTask,除非你必须要与UI线程交互.默认情况下使用Thread即可,要注意需要将线程优先级调低.

      从google官方文档你也可以看到,AsyncTasks should ideally be used for short operations (a few seconds at the most.)

      AsyncTask适合处理短时间的操作,长时间的操作,比如下载一个很大的视频,这就需要你使用自己的线程来下载,不管是断点下载还是其它的.

    参考:http://java.chinaitlab.com/base/919389.html

  • 相关阅读:
    访问通讯录并设置联络人信息
    创建提醒事项
    iOS 高仿:花田小憩3.0.1
    iOS 手机淘宝加入购物车动画分析
    VTMagic 的使用介绍
    React Native 从入门到原理
    用户数据攻略-获取日历事件
    键盘收回方法
    提高jQuery执行效率需要注意几点
    你应该了解的jquery 验证框架
  • 原文地址:https://www.cnblogs.com/kobe8/p/3781340.html
Copyright © 2011-2022 走看看