• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android中AsyncTask分析--你所不注意的坑,androidasynctask

Android中AsyncTask分析--你所不注意的坑,androidasynctask

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android asynctask,android中asynctask,android.os.asynctask,asynctask,asynctask的使用等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android中AsyncTask分析--你所不注意的坑,androidasynctask


AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.

本文不分析AsyncTask的使用,它的使用教程网上一搜一大堆,本文主要分析它的内部逻辑和实现,它是怎么实现异步的,它是怎么处理多个任务的,是并发么??

一、线程任务的调度

在AsyncTask内部会创建一个类相关的线程池来管理要运行的任务,也就就是说当你调用了AsyncTask的execute()后,AsyncTask会把任务交给线程池,由线程池来管理创建Thread和运行Therad。

在Android4.0版本中它内部是有两个线程池:SerialExecutor和ThreadPoolExecutor,SerialExecutor是串行的,ThreadPoolExecutor是并发的,而默认的就是SerialExecutor的,所以你一个程序中如果用了好几个AsyncTask你就得注意了:不要忘了换成并发的线程池执行。下面演示一下,穿行的调度

1.一个简单的例子:可以看出他是一个个执行的   代码如下:
public class AsyncTaskDemoActivity extends Activity {  
    private static int ID = 0;  
    private static final int TASK_COUNT = 9;  
    private static ExecutorService SINGLE_TASK_EXECUTOR;  
    private static ExecutorService LIMITED_TASK_EXECUTOR;  
    private static ExecutorService FULL_TASK_EXECUTOR;  
      
    static {  
        SINGLE_TASK_EXECUTOR = (ExecutorService) Executors.newSingleThreadExecutor();  
        LIMITED_TASK_EXECUTOR = (ExecutorService) Executors.newFixedThreadPool(7);  
        FULL_TASK_EXECUTOR = (ExecutorService) Executors.newCachedThreadPool();  
    };  
      
    @Override  
    public void onCreate(Bundle icicle) {  
        super.onCreate(icicle);  
        setContentView(R.layout.asynctask_demo_activity);  
        String title = "AsyncTask of API " + VERSION.SDK_INT;  
        setTitle(title);  
        final ListView taskList = (ListView) findViewById(R.id.task_list);  
        taskList.setAdapter(new AsyncTaskAdapter(getApplication(), TASK_COUNT));  
    }  
      
    private class AsyncTaskAdapter extends BaseAdapter {  
        private Context mContext;  
        private LayoutInflater mFactory;  
        private int mTaskCount;  
        List<SimpleAsyncTask> mTaskList;  
          
        public AsyncTaskAdapter(Context context, int taskCount) {  
            mContext = context;  
            mFactory = LayoutInflater.from(mContext);  
            mTaskCount = taskCount;  
            mTaskList = new ArrayList<SimpleAsyncTask>(taskCount);  
        }  
          
        @Override  
        public int getCount() {  
            return mTaskCount;  
        }  
  
        @Override  
        public Object getItem(int position) {  
            return mTaskList.get(position);  
        }  
  
        @Override  
        public long getItemId(int position) {  
            return position;  
        }  
  
        @Override  
        public View getView(int position, View convertView, ViewGroup parent) {  
            if (convertView == null) {  
                convertView = mFactory.inflate(R.layout.asynctask_demo_item, null);  
                SimpleAsyncTask task = new SimpleAsyncTask((TaskItem) convertView);  
                /* 
                 * It only supports five tasks at most. More tasks will be scheduled only after 
                 * first five finish. In all, the pool size of AsyncTask is 5, at any time it only 
                 * has 5 threads running. 
                 */  
                task.execute();
                // use AsyncTask#SERIAL_EXECUTOR is the same to #execute();  
//                task.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);  
                // use AsyncTask#THREAD_POOL_EXECUTOR is the same to older version #execute() (less than API 11)  
                // but different from newer version of #execute()  
//                task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);  
                // one by one, same to newer version of #execute()  
//                task.executeOnExecutor(SINGLE_TASK_EXECUTOR);  
                // execute tasks at some limit which can be customized  
//                task.executeOnExecutor(LIMITED_TASK_EXECUTOR);  
                // no limit to thread pool size, all tasks run simultaneously  
                //task.executeOnExecutor(FULL_TASK_EXECUTOR);  
                  
                mTaskList.add(task);  
            }  
            return convertView;  
        }  
    }  
      
    private class SimpleAsyncTask extends AsyncTask<Void, Integer, Void> {  
        private TaskItem mTaskItem;  
        private String mName;  
          
        public SimpleAsyncTask(TaskItem item) {  
            mTaskItem = item;  
            mName = "Task #" + String.valueOf(++ID);  
        }  
          
        @Override  
        protected Void doInBackground(Void... params) {  
            int prog = 1;  
            while (prog < 101) {  
                SystemClock.sleep(100);  
                publishProgress(prog);  
                prog++;  
            }  
            return null;  
        }  
          
        @Override  
        protected void onPostExecute(Void result) {  
        }  
          
        @Override  
        protected void onPreExecute() {  
            mTaskItem.setTitle(mName);  
        }  
          
        @Override  
        protected void onProgressUpdate(Integer... values) {  
            mTaskItem.setProgress(values[0]);  
        }  
    }  
}  
  
class TaskItem extends LinearLayout {  
    private TextView mTitle;  
    private ProgressBar mProgress;  
      
    public TaskItem(Context context, AttributeSet attrs) {  
        super(context, attrs);  
    }  
  
    public TaskItem(Context context) {  
        super(context);  
    }  
      
    public void setTitle(String title) {  
        if (mTitle == null) {  
            mTitle = (TextView) findViewById(R.id.task_name);  
        }  
        mTitle.setText(title);  
    }  
      
    public void setProgress(int prog) {  
        if (mProgress == null) {  
            mProgress = (ProgressBar) findViewById(R.id.task_progress);  
        }  
        mProgress.setProgress(prog);  
    }  
}  

  2.你想要的并发执行

上面的情况肯定不是你想要的,你想要的应该是这种情况: 只需要修改一行代码:
 task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);  

  当然也可以换成你自己的线程池。

二、源码分析

  1.成员变量:

定义了需要用到的成员,可以根据名字就能知道干什么的

//生产线程的工厂
private static final ThreadFactory sThreadFactory = new ThreadFactory() {
        private final AtomicInteger mCount = new AtomicInteger(1);

        public Thread newThread(Runnable r) {
            return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());
        }
    };
//存放任务的阻塞队列
    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);

    /**
     * 线性执行的执行器
     * An {@link Executor} that executes tasks one at a time in serial
     * order.  This serialization is global to a particular process.
     */
    public static final Executor SERIAL_EXECUTOR = new SerialExecutor();
    //内部交互的handler
    private static final InternalHandler s



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • AsyncTask注意事项,面试技巧和注意事项
  • 再谈Android AsyncTask的优缺点,androidasynctask
  • Android中AsyncTask分析--你所不注意的坑,androidasynctask
  • AsyncTask基础(笔记)
  • Android中AsyncTask基本用法与源码剖析(API 23)
  • android源码解析之(二)--)异步任务AsyncTask
  • AsyncTask源码探究,asynctask源码
  • android:异步任务asyncTask介绍及异步任务下载图片(带进度条)
  • Android线程操作对象AsyncTask线程机制
  • AsyncTask.cancel()的结束问题,asynctaskcancel

相关文章

  • 2017-05-26Android--httpclient模拟post请求和get请求分析
  • 2017-05-26银联支付,支付
  • 2017-05-26Android 数据库操作,android数据库操作
  • 2017-05-26MVP解析,mvp模式解析实践
  • 2017-05-26Android属性动画
  • 2017-05-26Activity猫的一生-故事讲解Activity生命周期,activity生命周期
  • 2017-05-26Android 判断当前语言环境是否是中文环境,android中文
  • 2017-05-26Android中访问sdcard路径的几种方式,androidsdcard
  • 2017-05-26如何通过cmdline获取panel型号的dtsi文件节点(qcom,lcd,id)
  • 2017-05-26安卓GreenDao框架一些进阶用法整理,安卓greendao

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • android studio java.io.IOException:setDataSourse fail.,androidctsfail
    • 手机IMEI获取,imei获取
    • 基于Ionic+Cordova+Bmob的开源项目实战
    • Android中activity的启动模式,androidactivity
    • Android开发简单服务器
    • Android:广播接收器(BroadCastReceiver)要点随笔。,
    • 解决通过Intent调用系统拍照程序,返回图片太小的问题,intent调用
    • andorid build tools 19.1,andorid19.1
    • Android游戏开发之游戏帧动画的播放与处理,android游戏开发
    • android:listview实现qq,微信好友列表(头像,昵称,个性签名)

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有