使用AsyncTask进行异步任务处理
在程序开启后,就会有一个主线程,负责与用户交互。如果在主线程中执行了耗时操作,那么界面就会卡顿,直到耗时操作结束后才会继续响应,非常影响用户体验,所以要使用异步操作来完成这些耗时操作。本节我们介绍android提供的轻量级异步类——AsyncTask来做异步线程处理。
AsynTask有着轻量级、操作方便等特点,适用于简单的异步处理过程,可以很容易实现异步操作,并且提供接口反馈当前的异步执行状态给主线程。
我们通过一个实例来体会如何使用AsyncTask。假设我们需要实现一个功能:输入某个网址,点击按钮抓取网页源码并显示在屏幕上。
首先我们新建一个项目,在主程序布局文件activity_main.xml中使用线性布局(Linearlayout),拖入需要用到的EditText(输入网址用)、Button(点击用)和TextView(显示抓取结果)三个控件。再使用ScrollView包裹可能会超出屏幕的TextView。具体布局如下:
|
|
然后使用findViewById()获取各个控件,并给Button建立监听,当此Button被点击后触发readURL()方法。代码片段如下:
|
|
接着我们在readURL()
中使用AsyncTask进行异步抓取目标网页数据。
AsyncTask定义了三种泛型类型Params、Progress、Result。Params指定了启动任务的执行参数(在本例中为URL的String类型),Progress指定了此异步任务执行进度,Result指定了后台执行任务最终返回的结果(本例中为返回的String类型网页内容)。
AsyncTask是抽象类,实例化必须要实现其抽象方法doInBackground ( String ... params )
。我们一般通过实现以下几个方法来完成一个异步任务的执行:
doInBackground(String... params)
:该方法运行在子线程中,负责负责执行耗时操作,在onPreExecute()
完成后立即执行;onPreExecute()
:当前任务开始前的预处理,可以用来做一些UI准备工作,如显示进度对话框;onPostExecute(String s)
:当后台操作结束时,此方法将会被调用,doInBackground()的结果将做为参数传递到此方法中,该方法可以用来显示处理结果;onProgressUpdate(Void... values)
:在调用publishProgress(Progress... values)
时,此方法被执行,直接将进度信息更新到UI组件上,该方法可以用来进度条的显示。
我们来看完整的readURL方法:
|
|
我们来看一下运行结果:
输入网址,点击读取数据,按钮立刻有了响应,抓取网页内容的任务在后台通过AsyncTask运行完毕,然后将结果返回给了UI主线程。
注意一定不要忘记对应用程序申请网络访问权限,即在AndroidManifest.xml中添加:<uses-permission android:name="android.permission.INTERNET"/>
。否则是无论如何也抓取不到网址的结果的。