安卓联系人源码 之AsyncTaskExecutors分析
2016-04-14 11:06
169 查看
/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.contacts.util; import android.os.AsyncTask; import android.os.Looper; import com.google.common.base.Preconditions; import java.util.concurrent.Executor; /** * Factory methods for creating AsyncTaskExecutors. * <p> * All of the factory methods on this class check first to see if you have set a static * {@link AsyncTaskExecutorFactory} set through the * {@link #setFactoryForTest(AsyncTaskExecutorFactory)} method, and if so delegate to that instead, * which is one way of injecting dependencies for testing classes whose construction cannot be * controlled such as {@link android.app.Activity}. */ public final class AsyncTaskExecutors { /** * A single instance of the {@link AsyncTaskExecutorFactory}, to which we delegate if it is * non-null, for injecting when testing. */ private static AsyncTaskExecutorFactory mInjectedAsyncTaskExecutorFactory = null; /** * Creates an AsyncTaskExecutor that submits tasks to run with * {@link AsyncTask#SERIAL_EXECUTOR}. */ public static AsyncTaskExecutor createAsyncTaskExecutor() { synchronized (AsyncTaskExecutors.class) { if (mInjectedAsyncTaskExecutorFactory != null) { return mInjectedAsyncTaskExecutorFactory.createAsyncTaskExeuctor(); } //内部是AsynTask内部实现的SerialExecutor SerialExecutor内部实现是封装了一个ArrayDeque,执行时从栈顶开始执行 return new SimpleAsyncTaskExecutor(AsyncTask.SERIAL_EXECUTOR); } } /** * Creates an AsyncTaskExecutor that submits tasks to run with * {@link AsyncTask#THREAD_POOL_EXECUTOR}. */ public static AsyncTaskExecutor createThreadPoolExecutor() { synchronized (AsyncTaskExecutors.class) { if (mInjectedAsyncTaskExecutorFactory != null) { return mInjectedAsyncTaskExecutorFactory.createAsyncTaskExeuctor(); } //内部是一个标准的线程池 public static final Executor THREAD_POOL_EXECUTOR //= new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, // TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory); return new SimpleAsyncTaskExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } } /** Interface for creating AsyncTaskExecutor objects. */ public interface AsyncTaskExecutorFactory { AsyncTaskExecutor createAsyncTaskExeuctor(); } public static void setFactoryForTest(AsyncTaskExecutorFactory factory) { synchronized (AsyncTaskExecutors.class) { mInjectedAsyncTaskExecutorFactory = factory; } } public static void checkCalledFromUiThread() { //检查AsynTask是否在主线程调用,asyntask必须在主线程调用 //此处用到了谷歌的一个包,如果不想导入额外的包的话可换一种方式实现 //if(Looper.myLooper() == Looper.getMainLooper()) { //throw new RuntimeException("Please don\'t call in the UI thread"); // } Preconditions.checkState(Thread.currentThread() == Looper.getMainLooper().getThread(), "submit method must be called from ui thread, was: " + Thread.currentThread()); } private static class SimpleAsyncTaskExecutor implements AsyncTaskExecutor { private final Executor mExecutor; //对线程池进行二次封装,执行任务时判断是否为主线程 public SimpleAsyncTaskExecutor(Executor executor) { mExecutor = executor; } @Override public <T> AsyncTask<T, ?, ?> submit(Object identifier, AsyncTask<T, ?, ?> task, T... params) { checkCalledFromUiThread(); return task.executeOnExecutor(mExecutor, params); } } }
相关文章推荐
- Show me the code之Python练习册 Q13 获取网络图片
- 佛祖保佑,永无bug
- php redis
- MOTT的学习(一)
- 保存图片时,设置压缩质量
- 微信开发学习 问题1: 网页授权问题 “该连接无法访问” 解决方法
- 使用chrome的xpath工具
- 【openstack】【nova】【libvirt】在计算节点上实现的imagecache
- 推送对账文件的3种
- 题
- Show me the code之Python练习册 Q11~12 关键词过滤
- ACM/OI 对拍程序的写法
- 使用afinal框架实现简单的下载
- 与文件操作相关的函数
- mfc 单文档显示当前系统时间
- 八皇后问题
- 分数修改
- iOS开发UI篇—iOS开发中三种简单的动画设置
- 全文检索的基本原理
- node学习笔记-搭建node环境