首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android AsyncTask完全解析,带你从源码角度彻底理解

2. doInBackground(Params...) 这个方法所有代码都会在子线程运行,我们应该在这里去处理所有的耗时任务。...()方法中去执行具体下载逻辑,在onProgressUpdate()方法显示当前下载进度,在onPostExecute()方法来提示任务执行结果。...其实也没有什么神秘,因为说到底,AsyncTask也是使用异步消息处理机制,只是做了非常好封装而已。...关于AsyncTask你所不知道秘密 不得不说,刚才我们在分析SerialExecutor时候,其实并没有分析很仔细,仅仅只是关注了它会调用mFuturerun()方法,但是至于什么时候会调用我们并没有进一步地研究...因此在3.0版本AsyncTask改动还是挺大,在3.0之前AsyncTask可以同时有5个任务在执行,而3.0之后AsyncTask同时只能有1个任务在执行

79850

【Android 异步操作】AsyncTask 异步任务 ( 参数简介 | 方法简介 | 使用方法 | AsyncTask 源码分析 )

方法在 子线程 执行 ; onPreExecute() : 在 doInBackground() 执行前先执行方法 , 主线程 执行 , 可更新 UI 界面 ; onProgressUpdate...() : 调用 publishProgress() 回调方法 , 主线程 执行 , 可更新 UI 界面 ; onPostExecute() : doInBackground() 执行完毕后再执行方法...doInBackground() 方法输入参数类型 Result 是返回值类型 , 也是 AsyncTask doInBackground() 方法执行完毕返回值类型 RunnableFuture..., 但是方法执行结果我们是不知道 ; 而在 AsyncTask 异步任务 , 执行 doInBackground() 方法 , 该方法也是在子线程执行 , 可以得到该方法执行结果 ,...这个执行结果是靠 Future 接口得到 ; 在 WorkerRunnable call() 方法执行doInBackground() 方法 ; 在 FutureTask done

65400
您找到你想要的搜索结果了吗?
是的
没有找到

Android多线程-AsyncTaskyi(一)

,当后台任务执行进度发生改变时, * 当然我们必须在doInBackground方法调用publishProgress() * 来设置进度变化值 * @param values...* 在主线程执行,在异步任务执行完成后,此方法会被调用 * 一般用于更新UI或其他必须在主线程执行操作,传递参数bitmap为 * doInBackground方法返回值...(4)onPostExecute(Result), 在主线程执行,在doInBackground 执行完成后,onPostExecute 方法将被UI线程调用,doInBackground 方法返回值将作为此方法参数传递到...我们这里再强调一下它们执行顺序,onPreExecute方法执行,接着是doInBackground方法,在doInBackground如果调用了publishProgress方法,那么onProgressUpdate...其实以前我也只是知道这回事而已,不过最近在SDK开发遇到了AsyncTask开发问题,产生问题场景是这样,我们团队在SDK中使用了AsyncTask作为网络请求类,因为现在大部分系统都是在Android

62120

AsyncTask解析

doInBackground(Params...) 这个方法在 子线程运行,应该在这里处理所有的耗时任务。 任务执行结束,可以通过 return语句来返回任务执行结果。...返回数据会被作为该方法参数传递过来,该方法是在 主线程运行,可以利用返回数据进行UI更新操作,如提醒任务执行结果或关闭掉进度条对话框等。...NOTE:AsyncTask cancel()方法并不是真正去取消任务,只是将这个任务设置为取消状态,需要在 doInBackgroud(Params…)方法判断终止任务。...在mWorker call()方法,会调用 doInBackground()执行耗时任务,并将执行结果通过 postResult(result)传递给内部Handler跳转到主线程。...线程切换: mWorkercall()方法,会先执行 doInBackground,并将执行结果通过 postResult()发送到主线程。

58310

【Android开发进阶系列】多线程专题

cancel()方法并不是真正去取消任务,只是设置这个任务为取消状态,我们需要在doInBackground()判断终止任务。...()方法中去执行具体下载逻辑,在onProgressUpdate()方法显示当前下载进度,在onPostExecute()方法来提示任务执行结果。...mWorkercall()方法执行了耗时操作,即result = doInBackground(mParams);,然后把执行得到结果通过postResult(result);,传递给内部Handler...然后调用线程池execute()方法执行具体耗时任务,即开头构造函数mWorkercall()方法内容。...如果收到消息是MESSAGE_POST_RESULT,即执行完了doInBackground()方法并传递结果,那么就调用finish()方法

35530

android异步消息机制 从源码层面解析(2)

AsyncTask 什么是AsyncTask AsyncTask是一个轻量级异步任务类,它可以在线程池中执行后台任务,然后把执行进度和结果传递给主线程并在主线程更新UI。...AsyncTask提供了四个核心方法 onPreExecute() 此方法在主线程执行,在异步任务执行之前,此方法会被调用,一般用于一些准备工作,例如下载进度条初始化。...doInBackground(Params… params) 此方法在子线程执行,用于执行异步任务,注意这里params就是AsyncTask第一个参数类型。...onProgressUpdate(Progress… values) 此方法在主线程执行,values类型就是AsyncTask传入第二个参数类型,当后台任务执行进度发生变化时此方法执行。...onPostExecute(Result result) 此方法在主线程执行,在doInBackground方法执行完成以后此方法会被调用,其中result类型就是AsyncTask传入第三个参数类型

51921

Asynctask那些事

这些都是我们经常听到词汇了,最常用方法就是Thread+Handler方法,今天就来聊聊另一个熟悉Asynctask,或许你没有听过,别着急,通过本次(API23)源码进行讲解,你就明白了。...mworker初始化操作,通过上面的代码我们知道一个抽象类,因此new了一个实现类,实现了call方法,call方法设置mTaskInvoked=true,且最终调用doInBackground(mParams...)方法,并返回Result值作为参数给postResult方法.可以看到我们doInBackground出现了。...onCancelled回调; 正常执行情况下调用我们onPostExecute(result); 主要这里调用是在handlerhandleMessage,所以是在UI线程。...方法 scheduleNext,则直接取出任务队列队首任务,如果不为null则传入THREAD_POOL_EXECUTOR进行执行

70571

AndroidAsyncTask入门使用学习指南

前言 AsyncTask异步任务,用于执行耗时任务并在UI线程更新结果。 我们都知道,Android UI线程不能执行耗时任务,否则就会出现ANR。...当UI线程需求处理耗时操作时,我们可以放在AsyncTaskdoInBackground方法执行,这个抽象类,有几个方法需要我们重新,除了doInBackground,我们可以在onPreExecute...,execute()其实也是通过执行executeOnExecutor()方法只是将其中Executor设置为默认值。...mTaskInvoked=true,且最终调用doInBackground(mParams)方法,并返回Result值作为参数给postResult方法.可以看到我们doInBackground出现了...方法scheduleNext,则直接取出任务队列队首任务,如果不为null则传入THREAD_POOL_EXECUTOR进行执行

40410

Android查缺补漏(线程篇)-- AsyncTask使用及原理详细分析

,需要在doInBackground方法调用publishProgress()发送任务执行进度,onProgressUpdate才能被回调。...onPreExecute方法log增加taskId,就不贴出了 在Activity初始化两个AsyncTask对象,并调用excute执行任务: public class AsyncTaskActivity...,同一个进程所有的AsyncTask任务都在这个线程池中排队执行。...} } }; 我们知道Future被执行后,会调用传入mWorkercall方法,在执行完mWorkercall方法之后或者FutureTask被取消时会调用done方法,我们看到源码在...前面所说这个FutureTask任务是在AsyncTask初始化时被封装好,在该任务调用了doInBackground方法用于异步执行我们添加耗时任务,doInBackground方法执行完毕会通过

54330

AsyncTask 使用及封装实践

同时需要声明一点是,下面下载例子只是进行简单下载而已,并没有支持断点续传下载。需要的话请自行到github上面找相应库,因为这并不是本篇博客重点。...AsyncTask主要几个方法 Void onPreExecute() 在task 任务开始执行时候调用,在doInBackground(Params… params)方法之前调用,在主线程执行...- Result doInBackground(Params… params) 主要用来执行耗时操作,在子线程执行,Params为我们参数类型。...()方法执行完毕之后,会调用这个方法,是在主线程执行。...在Activity里面定义静态方法 把需要访问View对象通过构造函数传递进来 采用接口回调机制 前面说到三种方法,是可以做到AsyncTask与外界进行通讯。但第一第二方法明显不行。

90510

译文:Android糟糕AsyncTask

生命周期 关于AsyncTask存在一个这样广泛误解,很多人认为一个在ActivityAsyncTask会随着Activity销毁而销毁。然后事实并非如此。...AsyncTask会一直执行doInBackground()方法直到方法执行结束。一旦上述方法结束,会依据情况进行不同操作。...如果在doInBackground()方法中有一个循环操作,我们应该在循环中使用isCancelled()来判断,如果返回为true,我们应该避免执行后续无用循环操作。...如果你调用了AsyncTaskcancel(false),doInBackground()仍然会执行方法结束,只是不会去调用onPostExecute()方法。...推荐一种进行异步操作技术就是使用Loaders。这个方法从Android 3.0 (Honeycomb)开始引入,在android支持包也有包含。

59910

AsyncTask源码解析

AsyncTask使用也很方便,开发时候多留意不要内存泄漏,一般处理方法就是把AsyncTask写成静态内部类形式。...这里可以知道AsyncTask构造方法mWorker即是WorkerRunnable具体实现,抽象类里只是承载了入参。...方法里,我们发现关键方法之二doInBackground,说明异步任务在这里执行,返回了Result对象。...mTask = task; mData = data; } } 好了,到这里我们已经理清异步任务执行结果或是执行过程进度是如何通知UI线程处理了。...到这里,AsyncTask几个关键方法执行时机和来龙去脉已经清楚,通过handler进行关联处理。 我们知道AsyncTask可以同时处理多个Runnable任务,那么内部又是如何保证执行顺序呢?

76550

Android AsyncTask实现原理和使用技巧分享

,甚至ANR,这些会使应用用户体验变差,但是有时又的确需要执行这些耗时任务,那么我们通常可以使用AsyncTask或者new Thread 来处理,这样把任务放入工作线程执行,不会占用主线程时间片...我们先新建一个类DemoAsyncTask继承AsyncTask,因为AsyncTask是抽象类,其中doInBackground方法必须重写。..., "test"); 简单分析下 上面就是AsyncTask最简单使用方法,我们上面重写方法,onInBackground方法运行在工作线程,其他方法全部运行在主线程,另外它运行方式Android...现在我们回过头来看,AsyncTask其实只是对JDK 1.5提供高级并发特性,concurrent架包做一个封装,方便开发者来处理异步任务,当然里面还有很多细节处理方法值得大家学习,如任务执行进度反馈...4.onPause判断应用是否要退出,从而决定是否取消AsyncTask执行

74130

Android AsyncTask实现原理和使用技巧分享

,甚至ANR,这些会使应用用户体验变差,但是有时又的确需要执行这些耗时任务,那么我们通常可以使用AsyncTask或者new Thread 来处理,这样把任务放入工作线程执行,不会占用主线程时间片...我们先新建一个类DemoAsyncTask继承AsyncTask,因为AsyncTask是抽象类,其中doInBackground方法必须重写。..., "test"); 简单分析下 上面就是AsyncTask最简单使用方法,我们上面重写方法,onInBackground方法运行在工作线程,其他方法全部运行在主线程,另外它运行方式Android...现在我们回过头来看,AsyncTask其实只是对JDK 1.5提供高级并发特性,concurrent架包做一个封装,方便开发者来处理异步任务,当然里面还有很多细节处理方法值得大家学习,如任务执行进度反馈...* 4.onPause判断应用是否要退出,从而决定是否取消AsyncTask执行

31930

深入解析AsyncTask原理

而在 AsyncTask ,比较常用方法有: onPreExecute 、 doInBackground 、 onPostExecute 和 onProgressUpdate 等。...而上述方法除了 doInBackground 运行在子线程,其他都是运行在主线程,相信大家对这几个方法也了如指掌了。...在 AsyncTask 设计,SERIAL_EXECUTOR 是默认任务执行器,并且是串行,也就导致了在 AsyncTask 任务都是串行地执行。...这里要注意是,如果想让 AsyncTask 并行地去执行任务,那么可以在 executeOnExecutor 方法传入一个并行任务执行器,这样就达到了并行效果。...所以 AsyncTask 可以理解为“线程池 + Handler”组合。 在 execute 方法,会先去调用 onPreExecute 方法,之后再在线程池中执行 mFuture 。

66920

详解Android AsyncTask 使用

AsyncTask 异步任务执行步骤:(以下方法除execute(Params… params),在AsyncTask重写),下列是相关方法介绍: A、execute(Params… params...().onPostExecute()这几个方法; D、不能在doInBackground(Params… params) 更改组件信息; E、一个任务实例只能执行一次,如果执行第二次会抛出异常...() 方法, * * 其次执行doInBackground()方法 */ public class MyAsyncTask extends AsyncTask<String, Integer,...:String 对应AsyncTask 第三个参数,也就是 * 接收了 从doInBackground() 返回结果; * 此方法doInBackground() 方法执行结束后执行,运行在...+result.getHeight()); } /** * 方法括号Integer 对应AsyncTask 第二个参数; * 在doInBackground() 每次调用publishProgress

1.1K20

Android 多线程几种方式

,也即是execute()参数类型 和 doInBackground()参数类型 第二个String代表处理过程参数类型,也就是doInBackground()执行过程产出参数类型,通过publishProgress...2) AsyncTaskdoInBackground(mParams)方法执行异步任务运行在子线程,其他方法运行在主线程,可以操作UI组件。...3) 不要手动去调用AsyncTaskonPreExecute, doInBackground, onProgressUpdate, onPostExecute方法,这些都是由Android系统自动调用一个任务...4) 运行可以随时调用cancel(boolean)方法取消任务,如果成功调用isCancelled()会返回true,并且不会执行onPostExecute() 方法了,取而代之是调用 onCancelled...而且从源码看,如果这个任务已经执行了这个时候调用cancel是不会真正把task结束,而是继续执行,只不过改变执行之后回调方法是onPostExecute还是onCancelled。

80720

Android十八章:ASYNCTASK分析一波

不需要传递参数就用Void来代替上述三个参数类型 AsyncTask 4个核心方法 onPreExecute() 异步开始前会执行方法,用于显示dialog doInBackground(Params...) 主线程执行,但异步方法执行完就会调用方法。...传入参数为doInBackground返回值. ps: 当doInBackground线程被取消就会回调给onCancelled这个方法,此方法被调用onPostExecute就不会调用了。...总结: asynctask对象要在主线程创建,并调用execute方法 不能直接调用doinbackground方法 一个asynctask对象只执行一次 3.0之前asynctask用并行线程池执行,...方法执行,将之前mFuture对象插入队列mTask里面,判断当前有没有任务在进行,没活动就调用schedulNext方法执行下一个asynctask任务。

39930
领券