异步任务(AsyncTask)

Android中,为避免UI线程阻塞,通常将耗时操作放在新线程。AsyncTask提供了一种简化线程间通信和更新UI的方式。它比Handler更轻量级,适合简单异步处理。AsyncTask包含三个泛型参数,用于输入、进度和结果。通过执行doInBackground、onPreExecute、onProgressUpdate和onPostExecute方法,可以在后台线程执行任务并更新UI。使用时必须在UI线程创建并执行AsyncTask,且每个实例只能执行一次。

为了避免UI线程失去响应的问题,Android建议将耗时操作放在新线程中完成,但新线程也可能需要动态更新UI组件:比如需要从网上获取一个网页,然后在TextView中将其源代码显示出来,此时就应该将连接的网络、获取网络数据的操作放在新线程中完成。问题是:获取网络数据之后,新线程不允许直接更新UI组件。

为了解决新线程不能更新UI组件的问题,Android提供了下面几种解决方案:

1. 使用Handler实现线程间通信

2. Activity.runOnUiThread(Runnable)

3. View.post(Runnable)

4. View.postDelayed(Runnable, long)


后3种方式可能导致编程略显繁琐,而异步任务(AsyncTask)则可以进一步简化这种操作

Handler与AsyncTask比较:AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可实现


AsyncTask<Params, Progress, Result>是抽象类,用于被继承,它定义的三种泛型类型

Params:     启动任务执行的输入参数的类型

Progress:  后台任务完成的进度值的类型

Result:      后台执行任务完成后返回结果的类型


使用AsyncTask的步骤:

1.    创建AsyncTask子类,并为三个泛型参数指定类型。如果某个泛型参数不需要指定类型,设为void即可

2.    根据需要,实现AsyncTask的如下方法:

doInBackground(Params...):    重写该方法就是后台线程将要完成的任务。该方法可以调用publicProgress(Progress... values)方法更新任务的执行进度

onProgressUpdate(Progress... values):    在doInBackground()方法中调用publicProgress()方法更新任务的执行进度后,将会触发该方法

onPreExecute():    该方法将在执行后台耗时操作前被调用。此方法通常用于完成一些初始化的准备工作,比如在界面上显示进度条等

onPostExecute(Result result):    当doInBackground()完成后,系统会自动调用onPostExecute()方法,并将doInBackground()方法的返回值传给该方法

3. 调用AsyncTask子类的实例的execute(Params... params)开始执行耗时任务


使用AsyncTask时必须遵守如下规则:

1.必须在UI线程中创建AsyncTask实例

2.必须在UI线程中调用AsyncTask的execute()方法

3.AsyncTask的onPreExecute()、onPostExecute(Result result)、doInBackground(Params... params)、onPregressUpdate(Progress... values)方法,不应该由程序员代码调用,而是由Android系统负责调用

4.每个AsyncTask只能被执行一次,多次调用将会引发异常


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值