Android进阶2之AsyncTask实现异步处理任务

<一>AsyncTask实现异步处理任务

在开发Android应用时必须遵守单线程模型的原则:AndroidUI操作并不是线程安全的并且这些操作必须在UI线程中执行。在单线程模型中始终要记住两条法则:
1.不要阻塞UI线程
2.确保只在UI线程中访问AndroidUI工具包
当一个程序第一次启动时,Android会同时启动一个对应的主线程(MainThread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。
比如说从网上获取一个网页,在一个TextView中将其源代码显示出来,这种涉及到网络操作的程序一般都是需要开一个线程完成网络访问,但是在获得页面源码后,是不能直接在网络操作线程中调用TextView.setText().因为其他线程中是不能直接访问主UI线程成员


<二>Android提供了一些其他线程中访问UI线程的方法
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable,long)
Hanlder
但是这些类或方法都有一些问题。会使你的代码很复杂很难理解。实现一些很复杂的操作并需要频繁地更新UI时这会变得更糟糕。
为了解决这个问题,Android提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单。不需要借助线程和Handler即可实现。

<三>AsyncTask操作步骤

AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。

<1>子类化AsyncTask

AsyncTask是抽象类我们必须自己写一个类来继承AsyncTask 类

<2>实现AsyncTask中定义的下面方法 (很关键)

onPreExecute() 该方法将在执行实际的后台操作前被UIthread调用。这个方法只是做一些准备工作,如在界面上显示一个进度条。

doInBackground(Params...), 将在onPreExecute方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。

publishProgress 该方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。

onProgressUpdate(Progress...), publishProgress方法被调用后,UIthread将调用这个方法从而在界面上展示任务的进展情况,可以通过一个进度条进行展示。

onPostExecute(Result), doInBackground执行完成后,onPostExecute方法将被UIthread调用,后台的计算结果将通过该方法传递到UIthread.

<四>AsyncTask遵守准则

为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
<1>Task的实例必须在UIthread中创建
<2>execute方法必须在UIthread中调用
<3>不要手动的调用onPreExecute(),onPostExecute(Result)doInBackground(Params...),onProgressUpdate(Progress...)这几个方法
<4>task只能被执行一次,否则多次调用时将会出现异常

<五>AsyncTask的泛型

AsyncTask定义了三种泛型类型ParamsProgressResult
Params 启动任务执行的输入参数,比如HTTP请求的URL
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String

不是所有类型都总是被异步任务使用。如果标记哪个参数不用,只是用void代替就可以了。

<六>取消异步任务

只要调用cancel(boolean)方法,一个异步任务可以随时取消。调用这个方法会导致后来的调用isCancelled()返回true。

确保任务被取消尽可能快,你应该总是定期从doInBackground(Object[])中检查isCancelled()返回值。


Android进阶2之AsyncTask实现异步处理任务Android进阶2之AsyncTask实现异步处理任务


具体实现:

注意:添加网络权限:

mian.xml



你可能感兴趣的:(AsyncTask)