SDK - (1) - AsyncTask

本文深入解析了Android中的AsyncTask,一种轻量级异步任务类,包括其定义、使用方法、机制原理及注意事项。介绍了如何避免内存泄漏、生命周期冲突等问题,以及在不同Android版本中并行与串行执行的区别。
摘要由CSDN通过智能技术生成

一、什么是AsyncTask

1、是一种轻量级的异步任务类;

2、是一个封装了线程池和Handler的异步框架;

3、使用它可以更加方便的执行后台任务以及在主线程访问UI,但他不适合进行特别耗时的后台任务;

 

二、AsyncTask的使用方法

1、3个参数

Params:执行AsyncTask时,后台任务需要传入的参数,在doInBackground中取出使用。

Progress:后台任务执行时,如果需要显示当前进度,则制定进度的数据类型。

Result:后台任务执行完成后的返回值类型。

2、5个方法

onPreExecute:

在主线程中执行,在后台任务执行前调用,通常用于做一些准备操作。

 

doInBackground(Params… params):

在线程池中执行,用于执行后台任务;params 参数是 execute(Params… params)方法中传递的参数。在此方法中可以调用 publishProgress 方法来更新任务的进度,publishProgress方法会调用onProgressUpdate方法。

 

publishProgress(Progress… values):

用于更新任务的进度,需要手动调用,publishProgress方法会调用onProgressUpdate方法;values参数为设置的进度值。

 

onProgressUpdate(Progress… values):

在主线程中执行,当后台任务的执行进度发生改变时,会被调用,values参数为进度值。

 

onPostExecute(Result result):

在主线程中执行,当后台任务执行完成时,会被调用。result 的值是doInBackground的返回值。

 

三、AsyncTask的机制原理

AsyncTask中有两个线程池(SerialExecutor和THREAD_POOL_EXECUTOR)和一个Handler(InternalHandler),其中线程池SerialExecutor用于任务的排队,而线程池THREAD_POOL_EXECUTOR用于真正地执行任务,InternalHandler用于将执行环境从线程池切换到主线程

 

当将这些任务提交到静态的线程池中执行时,线程池中的工作线程执行doInBackgroup(Params… params)方法执行异步任务。当任务状态改变后,工作线程向UI线程发送消息,AsyncTask内部的InternalHandler 响应这些消息,并调用相关的回调函数。

 

四、AsyncTask的注意事项

1、内存泄漏

原因:非静态内部类持有外部类的匿名引用,导致Activity无法释放。

 

解决:

AsyncTask内部持有外部Activity的弱引用。

AsyncTask改为静态内部类。

AsyncTask.cancel()。

2、生命周期

不受Activity生命周期的影响,在Activity销毁之前,取消AsyncTask的运行,以此来保证程序的稳定。

 

3、结果丢失

由于屏幕旋转、Activity在内存紧张时被回收等情况下,Activity会被重新创建,此时,还在运行的AsyncTask会持有一个Activity的非法引用即之前的Activity实例。导致onPostExecute()没有任何作用。

 

4、并行or串行

Android 1.6之前,默认采用串行执行任务;

Android 1.6~ 2.3 ,默认采用并行执行任务;

Android 3.0,默认采用串行执行任务,如果需要改为并行,可以调用AsyncTask的executeOnExecutor()来执行任务即可。

5、AsyncTask的使用限制

AsyncTask的对象必须在主线程中创建;

execute 方法必须在UI线程调用;

不要在程序中手动调用 onPreExecute、onPostExecute、 doInBackground、onProgressUpdate方法;

一个AsyncTask对象只能调用一次excute()方法,执行一次,否则会报异常

参考:https://blog.csdn.net/lingguiqin/article/details/79184356

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值