源码简读之AsyncTask
来源:互联网 发布:淘宝代刷平台 编辑:程序博客网 时间:2024/06/14 00:21
源码注释中声明:适用于a few minutes的任务。
封装了Handler+线程池。
核心线程数:至少2个,最多4个。
最大线程数:CPU核数*2+1
线程保活时间:30s
方法
- onPreExecute()
- doInBackground()
- onProgressUpdate()
- publishProgress()
- onPostExecute()
初始化
// We want at least 2 threads and at most 4 threads in the core pool,// preferring to have 1 less than the CPU count to avoid saturating// the CPU with background workprivate static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;private static final int KEEP_ALIVE_SECONDS = 30;// 内部使用的BlockingQueueprivate static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(128);// 初始化线程池static { ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_SECONDS, TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory); threadPoolExecutor.allowCoreThreadTimeOut(true); THREAD_POOL_EXECUTOR = threadPoolExecutor;}// 在初始化时,先创建一个Callable对象的mWorker线程对象,然后再转换为FutureTaskpublic AsyncTask() { mWorker = new WorkerRunnable<Params, Result>() { public Result call() throws Exception { mTaskInvoked.set(true); Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); //noinspection unchecked Result result = doInBackground(mParams); Binder.flushPendingCommands(); return postResult(result); } }; mFuture = new FutureTask<Result>(mWorker) { @Override protected void done() { try { postResultIfNotInvoked(get()); } catch (InterruptedException e) { android.util.Log.w(LOG_TAG, e); } catch (ExecutionException e) { throw new RuntimeException("An error occurred while executing doInBackground()", e.getCause()); } catch (CancellationException e) { postResultIfNotInvoked(null); } } };}// 处理返回的数据,发送给 mHandler;private Result postResult(Result result) { @SuppressWarnings("unchecked") Message message = getHandler().obtainMessage(MESSAGE_POST_RESULT, new AsyncTaskResult<Result>(this, result)); message.sendToTarget(); return result;}// mHandler是一个获取了MainLooper的对象,根据super(Looper.getMainLooper())就可以把该Handler转变成一个可以操作主线程的handler。private static class InternalHandler extends Handler { public InternalHandler() { super(Looper.getMainLooper()); } @SuppressWarnings({"unchecked", "RawUseOfParameterizedType"}) @Override public void handleMessage(Message msg) { AsyncTaskResult<?> result = (AsyncTaskResult<?>) msg.obj; switch (msg.what) { case MESSAGE_POST_RESULT: // There is only one result result.mTask.finish(result.mData[0]); break; case MESSAGE_POST_PROGRESS: result.mTask.onProgressUpdate(result.mData); break; } }}
0 0
- 源码简读之AsyncTask
- 读AsyncTask源码之浅析
- Android之AsyncTask源码解析
- Android 源码解析之AsyncTask
- AsyncTask源码分析之二
- at之asynctask源码解答
- Android 源码解析之AsyncTask
- Android源码探究之AsyncTask 源码解析
- (源码阅读)源码分析之AsyncTask
- Android多线程之AsyncTask源码分析
- Android异步任务之AsyncTask源码解析
- 面试系列之AsyncTask源码深入解读
- AsyncTask源码分析之Java篇
- Android AsyncTask 异步任务之源码解析
- AsyncTask源码分析之Android篇
- Android基础之AsyncTask源码解析
- android多线程之AsyncTask源码分析
- Android源码阅读之——AsyncTask
- leetCode---Subsets
- windows下python安装xgboost
- 基于nodejs配置vue工程
- for循环打印矩形
- 《APUE》读书笔记-第十四章高级I/O
- 源码简读之AsyncTask
- ASP.NET MVC框架入门
- (转)android AsyncTask介绍
- 信息系统项目管理知识--软件工程
- 求数组的逆序对
- GDOI第四轮模拟day2总结
- Mac操作
- DSP实验三(外部扩展)
- 数值的整数次方