今天分析android的异步线程类HandlerThread与IntentService,它们都是android系统独有的线程类,而android中还有另一个比较重要的异步线程类AsyncTask。...是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后会把执行的进度和最终结果传递给主线程并更新UI。...此外doInBackground方法会将计算的返回结果传递给onPostExecute方法。...ok~,最后看看我们的运行结果: image.png 效果符合预期,通过这个案例,相信我们对AsyncTask的使用已相当清晰了。...一般使用AsyncTask内部提供的线程池即可(也可以自己创建),第二个参数,就是最终会传递给doInBackground方法的可变参数,这里不传,所以直接给了空白符。
文章目录 一、什么是AsyncTask 二、AsyncTask的使用方法 三、AsyncTask的内部原理 四、AsyncTask的注意事项 1、内存泄漏的解决方案 2、生命周期 3、结果丢失 4、并行...or 串行 一、什么是AsyncTask 1、本质上就是一个封装了线程池和handler的异步框架 二、AsyncTask的使用方法 1、三个参数 params是执行AsyncTask时需要传入的参数...1、内存泄漏的解决方案 1)、内部类使用静态内部类; 2)、传进来的外部activity使用弱引用; 3) 、在Acitvity的onDestory() 方法中取消线程调用AsyncTask.cancel...(); 2、生命周期 1)、如果没有在activity的onDestory() 方法中取消线程调用AsyncTask.cancel(),可能会导致系统的不稳定; 3、结果丢失 当系统内存不足,活着屏幕旋转...,使得Activity重新创建,而AsyncTask中持有的是原activity 的引用,在线程执行结束后要更新界面时,原activity已经没了。
当我们通过某个组件来启动另一个组件的时候,这个时候默认都是在同一个线程当中完成的。当然,我们可以自己来管理我们的Android应用的线程,我们可以根据我们自己的需要来给应用程序创建额外的线程。...我们可以将耗时的操作放在异步任务当中来执行,并随时将任务执行的结果返回给我们的UI线程来更新我们的UI控件。通过AsyncTask我们可以轻松的解决多线程之间的通信问题。...UI线程的结果的类型 我们在定义一个类继承AsyncTask类的时候,必须要指定好这三个泛型的类型,如果都不指定的话,则都将其写成Void,例如: AsyncTask 接下来我们来看看我们的Activity代码: public class MainActivity extends Activity {
什么是AsyncTask AsyncTask内部封装了Thread和Handler,可以让我们在后台进行计算或者把计算的结果及时更新到UI上。...,而 Result 则表示后台任务的返回结果的类型,如果 AsyncTask 不需要传 递具体的参数,那么这三个泛型参数可以用 Void 来代替。...AsyncTask生命周期问题 一个在 Activity 中创建的 AsyncTask 不会随着 Activity 的销毁而销毁。...AsyncTask内存泄漏问题 如果 AsyncTask 被声明为 Activity 的非静态内部类,那么 AsyncTask 会保留一个 对 Activity 的引用。...AsyncTask结果丢失问题 屏幕旋转或 Activity 在后台被系统杀掉等情况会导致 Activity 的重新创建,之前运行的 AsyncTask 会持有一个之前 Activity 的引用,这个引用已经无效
作用 实现多线程 在工作线程中执行任务,如 耗时任务 异步通信、消息传递 实现工作线程 & 主线程(UI线程)之间的通信,即:将工作线程的执行结果传递给主线程,从而在主线程中执行相关的UI操作 从而保证线程安全...使用时的注意点 在使用AsyncTask时有一些问题需要注意的: 7.1 关于 生命周期 结论 AsyncTask不与任何组件绑定生命周期 使用建议 在Activity 或 Fragment中使用...AsyncTask时,最好在Activity 或 Fragment的onDestory()调用 cancel(boolean); 7.2 关于 内存泄漏 结论 若AsyncTask被声明为Activity...的非静态内部类,当Activity需销毁时,会因AsyncTask保留对Activity的引用 而导致Activity无法被回收,最终引起内存泄露 使用建议 AsyncTask应被声明为Activity...的静态内部类 7.3 线程任务执行结果 丢失 结论 当Activity重新创建时(屏幕旋转 / Activity被意外销毁时后恢复),之前运行的AsyncTask(非静态的内部类)持有的之前Activity
生命周期 关于AsyncTask存在一个这样广泛的误解,很多人认为一个在Activity中的AsyncTask会随着Activity的销毁而销毁。然后事实并非如此。...详细请参考细话Java:”失效”的private修饰符,由于AsyncTask的生命周期可能比Activity的长,当Activity进行销毁AsyncTask还在执行时,由于AsyncTask持有Activity...结果丢失 另一个问题就是在屏幕旋转等造成Activity重新创建时AsyncTask数据丢失的问题。...实际上是结果依据API不同而不同。 在1.6(Donut)之前: 在第一版的AsyncTask,任务是串行调度。一个任务执行完成另一个才能执行。...由于串行执行任务,使用多个AsyncTask可能会带来有些问题。所以这并不是一个很好的处理异步(尤其是需要将结果作用于UI试图)操作的方法。
同时这不是一个通用的多线程编程框架,他被设计为用于能够在 最多几秒的时间内返回结果的任务。...,具体对应三个 Params 执行时发送给任务的参数的类型 Progress 后台执行过程进度的类型 Result 执行结果返回值的类型 当不需要这些参数的时候可以设置为...由于不太方便录屏和传gif图,我这里就简单说下会发生的事情:进度框会再度弹出,这没什么问题,但是进度条会停留在0%不动,直到一段时间之后弹出Toast显示下载完成,接着进度条开始慢慢增加,当达到百分之百时再次弹出...而AsyncTask的生命周期和Activity是无关的,那么当Activity被finish后,AsyncTask依然存在,而他持有着Activity的引用导致Activity无法被垃圾回收。...同时如果使用了非静态匿名内部类来实现AsyncTask,由于Java内部类的特点,他同样会持有当前Activity的引用造成内存泄漏。
作用 实现多线程 在工作线程中执行任务,如 耗时任务 异步通信、消息传递 实现工作线程 & 主线程(UI线程)之间的通信,即:将工作线程的执行结果传递给主线程,从而在主线程中执行相关的UI操作...使用时的注意点 在使用AsyncTask时有一些问题需要注意的: 7.1 关于 生命周期 结论 AsyncTask不与任何组件绑定生命周期 使用建议 在Activity 或 Fragment中使用...AsyncTask时,最好在Activity 或 Fragment的onDestory()调用 cancel(boolean); 7.2 关于 内存泄漏 结论 若AsyncTask被声明为Activity...的非静态内部类,当Activity需销毁时,会因AsyncTask保留对Activity的引用 而导致Activity无法被回收,最终引起内存泄露 使用建议 AsyncTask应被声明为Activity...的静态内部类 7.3 线程任务执行结果 丢失 结论 当Activity重新创建时(屏幕旋转 / Activity被意外销毁时后恢复),之前运行的AsyncTask(非静态的内部类)持有的之前Activity
),它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。 ...任务一旦完成就可以通过return语句来将任务的执行结果进行返回,如果AsyncTask的第三个泛型参数指定的是Void,就可以不返回任务执行结果。...mWorker中的call()方法执行了耗时操作,即result = doInBackground(mParams);,然后把执行得到的结果通过postResult(result);,传递给内部的Handler...,那么AsyncTask会保留一个对创建了AsyncTask的Activity的引用。...3) 结果丢失 屏幕旋转或Activity在后台被系统杀掉等情况会导致Activity的重新创建,之前运行的AsyncTask(非静态的内部类)会持有一个之前Activity的引用,这个引用已经无效
概述 AsyncTask是一个抽象类,它是Android封装的一个轻量级异步操作的类。它可以在线程池中执行后台任务,然后把执行的进度和最终的结果传递到主线程,并在主线程中更新UI。...在mWorker的 call()方法中,会调用 doInBackground()执行耗时任务,并将执行结果通过 postResult(result)传递给内部Handler跳转到主线程中。...AsyncTask使用不当的后果 1. 内存泄漏 如果AsyncTask被声明为Activity的非静态内部类,那么AsyncTask会保留一个对创建了AsyncTask的Activity的引用。...如果Activity已经被销毁,AsyncTask的后台线程还在执行,它将继续在内存里保留这个引用,导致Activity无法被回收,引起内存泄露。...结果丢失 屏幕旋转或Activity在后台被系统杀掉等情况会导致Activity的重新创建,之前运行的AsyncTask(非静态的内部类)会持有一个之前Activity的引用,这个引用已经无效,这时调用
AsyncTask是android为我们提供执行异步任务的一个轻量的类,可以用来处理耗时操作,并且能够很方便的将执行结果返回给主线程。本篇文章将会通过源码分析来介绍AsyncTask的内部实现原理。...这个params我们知道它是我们传进来的参数,但是sDefaultExecutor是什么呢?它是一个线程池,是一个类的成员变量。...图解AsyncTask执行过程 要想知道执行结果是如何被传递到线程中,我们先搞明白AsyncTask的执行过程。其实读者从上面的内容中或许能改猜到它的大概执行过程。...结合上面的执行流程图我们知道,在经过上面7个步骤异步任务一个一个的在线程池中被完成。既然我们知道了AsyncTask的大致执行过程,那么它是如何将执行结果返回到主线程呢?下面我们将会来分析。...当call()方法在执行完doInBackground()方法得到结果后,会将该结果传递给postResult()方法: private Result postResult(Result result)
,可以很方便的在线程池中执行异步任务,并且将进度和结果传递给主线程。...: Parmas:参数类型 Progress:异步任务的执行进度类型 Result:异步任务执行完毕后返回结果的类型 在使用AsyncTask执行异步任务需要创建一个类,让这个类继承AsyncTask,.../cn.codingblock.thread I/MyAsyncTask: onPostExecute: result=执行结果:100.0% 2、多个AsyncTask对象在执行异步任务时,默认是串行执行的...} else { onPostExecute(result); // 任务完成后就将执行结果传递给onPostExecute方法 } mStatus = Status.FINISHED...} else { onPostExecute(result); // 任务完成后就将执行结果传递给onPostExecute方法 } mStatus = Status.FINISHED
AsyncTask 什么是AsyncTask AsyncTask是一个轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和结果传递给主线程并在主线程中更新UI。...,它输入参数为图片url地址,后台的进程参数为Integer类型,后台任务的返回结果为bollean类型。...另一个是FutureTask,它的参数就是前面创建的WorkerRunnable对象。 接下来我们再看AsyncTask的execute()方法,这个方法是整个异步任务的入口。...AsyncTask构造函数传进来的第一个参数,传入到doInBackground(mParams)中 mWorker.mParams = params; //******************...就是Callable c = callable;里传进来的callable,而callable就是我们最开始在AsyncTask构造方法里传进来的WorkerRunnable,所以接着就该看看WorkerRunnable
在这里WorkerRunnable作为参数传递给了FutureTask。这两个变量会暂时保存在内存中,稍后会用到它们。 当要执行AsyncTask时,需要调用它的execute方法,代码如下所示。...这里会首先调用 onPreExecute方法,在注释1处将AsyncTask的参数传给WorkerRunnable,从前面我们知道WorkerRunnable会作为参数传递给了FutureTask,因此...接下来会调用exec的execute方法,并将mFuture也就是前面讲到的FutureTask传进去。...这里exec是传进来的参数sDefaultExecutor,它是一个串行的线程池,它的代码如下所示。 ?...如果AsyncTask任务被取消了则执行onCancelled方法,否则就调用onPostExecute方法。而正是通过onPostExecute方法我们才能够得到异步任务执行后的结果。
1 ) AsyncTask实现的原理 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作 使用的优点:简单,快捷,过程可控 使用的缺点:...在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来. 2 )Handler异步实现的原理 在Handler 异步实现时,主要是主线程启动Thread(子线程)并生成Message,传递给Handler...Integer,更新之后的数值是Integer,最后的结果是字符串String private class ChileUpdate extends AsyncTask<Integer, Integer...任务一旦完成就可以通过return 语句来将任务的执行结果返回,如果AsyncTask 的 * 第三个泛型参数指定的是Void,就可以不返回任务执行结果。...* 返回的数据会作为参数传递到此方法中,可以利用返回的数据来进行一些UI 操作, * 比如说提醒任务执行的结果,以及关闭掉进度条对话框等。
答:其实除了Activity,其它组件也都在主线程。这就意味着如果在其他组件中做耗时操作的话,同样会另主线程阻塞。 问题3:当有耗时操作时,一般怎么处理?...线程间的交互 我们假设一个经常发生的场景,某个前台UI需要通过服务器获取数据,比如获取今天的天气情况。 有开发经验的同学立马就知道必须开子线程去进行网络操作,再通过线程间交互把数据回传。...我们贴两段简单的代码吧~ (1)AsyncTask AsyncTask getWeatherTask = new AsyncTask() { @Override protected Object...AsyncTask的原理其实也是用Looper + Handler的方式,在子线程进行耗时操作,再把结果返回到主线程,在onPostExecute中处理。...问题来了 Thread的例子代码里,如果我们不给Handler的构造方法传参数是不是可以呢? 其实得看情况, · 如果是在主线程创建的handler,那没问题 · 如果是在子线程,则会抛出异常
)的参数类型 第二个String代表处理过程中的参数类型,也就是doInBackground()执行过程中的产出参数类型,通过publishProgress()发消息 传递给onProgressUpdate...如果您的App没有明确指定屏幕方向和configChanges时,当用户旋转屏幕的时候Activity就会重新启动,而这个时候您的异步加载数据的线程可能正在请求网络。...当一个新的Activity被重新创建之后,就又重新启动了一个新的任务去请求网络,这样之前的一个异步任务不经意间就泄露了,假设你还在onPostExecute写了一些其他逻辑,这个时候就会发生意想不到异常...Android会在销毁你的Activity之前调用onSaveInstanceState()方法,于是,你可以在此方法中存储关于应用状态的数据。...但是,对于AsyncTask怎么办?问题产生的根源在于Activity销毁重新创建的过程中AsyncTask和之前的Activity失联,最终导致一些问题。
通常在这里执行耗时的后台计算。计算的结果必须由该函数返回,并被传递到onPostExecute()中。...后台计算的结果会被作为参数传递给这一函数。...5、取消任务:onCancelled (),在调用AsyncTask的cancel()方法时调用 AsyncTask的构造函数有三个模板参数: 1.Params,传递给后台任务的参数类型。...2.Progress,后台计算执行过程中,进步单位(progress units)的类型。(就是后台程序已经执行了百分之几了。) 3.Result, 后台执行返回的结果的类型。...总结:1、 AsyncTask的本质是一个静态的线程池,AsyncTask派生出的子类可以实现不同的异步任务,这些任务都是提交到静态的线程池中执行。
领取专属 10元无门槛券
手把手带您无忧上云