android开发之AsyncTask的用法

来源:互联网 发布:程序员和产品经理 编辑:程序博客网 时间:2024/04/30 21:36

在Android中实现异步任务机制有两种方式,Handler和AsyncTask。

Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。关于Handler的相关知识,前面也有所介绍,不清楚的朋友们可以参照一下。

为了简化操作,Android1.5提供了工具类android.os.AsyncTask,它使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务。

先来看看AsyncTask的定义:

public abstract class AsyncTask<Params, Progress, Result> {  

三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。在特定场合下,并不是所有类型都被使用,如果没有被使用,可以用java.lang.Void类型代替。

一个异步任务的执行一般包括以下几个步骤:

1.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。

2.onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。

3.doInBackground(Params... params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。

4.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。

5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。

在使用的时候,有几点需要格外注意:

1.异步任务的实例必须在UI线程中创建。

2.execute(Params... params)方法必须在UI线程中调用。

3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。

4.不能在doInBackground(Params... params)中更改UI组件的信息。

5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。

(以上内容转自:http://blog.csdn.net/liuhe688/article/details/6532519)

为了对该方法有更为深入的认识,下面以一个例子来说明。

该例子要实现的是进度条倒计时的功能。时长30s,随着时间的减少,进度条逐渐缩短,同时文本框中的剩余时间也相对应减少。

import android.os.AsyncTask;import android.widget.ProgressBar;import android.widget.TextView;class TestAsyncTask extends AsyncTask<String, Integer, String>  {  FullscreenActivity activity;  TextView textView;ProgressBar bar;public TestAsyncTask(FullscreenActivity activity, TextView textView, ProgressBar bar ) {this.activity = activity;this.textView = textView;this.bar = bar;}    //TestAsyncTask被后台线程执行后,被UI线程被调用,一般用于初始化界面控件,如进度条      @Override     protected void onPreExecute() {          // TODO Auto-generated method stub          super.onPreExecute();      }      //doInBackground执行完后由UI线程调用,用于更新界面操作      @Override     protected void onPostExecute(String result) {          // TODO Auto-generated method stub                  //textView.setText(result);          super.onPostExecute(result);      }      //在PreExcute执行后被启动AysncTask的后台线程调用,将结果返回给UI线程      @Override     protected String doInBackground(String... params) {          // TODO Auto-generated method stub          bar.setMax(300);        int i = 30;    while(true)    {    publishProgress((int)i);    if(i == 0 ) break;    try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}    i--;        }        return null;      }@Overrideprotected void onProgressUpdate(Integer... values) {// TODO Auto-generated method stubbar.setProgress(values[0]*10);          textView.setText("" + values[0] + " s");  super.onProgressUpdate(values);}             }  

在UI线程中:

new TestAsyncTask(FullscreenActivity.this, textView, bar).execute("");

以上采用了AsyncTask来实现异步更新进度条。能够不影响程序运行的基础上在后台不断更新前端UI。

该方法还可以用来显示处理进度、计时、载入进度等功能。


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 酷狗k歌有杂音怎么办 手机k歌音质不好怎么办 酷狗让升级内测取消之后怎么办 苹果5s声音太小怎么办 苹果6p调均衡卡怎么办 忘记密码怎么办登录云教育 登录微信收不到验证码怎么办 红米手机黑白屏怎么办 手机登录不上电子邮件怎么办 如果台湾发生骚乱大陆怎么办 80端口被占用了怎么办? qq邮箱服务器密码忘记了怎么办 对方身份异常请验证怎么办 qq附近人屏蔽了怎么办 快递地址填错了怎么办 快递填错地址已经发货怎么办 淘宝受到卖家威胁怎么办 消费者被外卖商家威胁怎么办 拼多多商家打电话威胁怎么办 退款被拒商家还威胁怎么办? 打错电话给领导怎么办 领导送礼物给我怎么办 南瓜饼和面很稀怎么办 包饺子剩的肉馅怎么办 发好的面团粘手怎么办 富士变频器减速时间过电流怎么办 铺木地板地面不是很平怎么办 眼镜被铁锈烫了怎么办 平车机针头小了怎么办 mk包五金坏了怎么办 迁坟原来的棺材怎么办 新建定额项目没有措施项目怎么办 太岁符忘记烧了怎么办 穿裙子去了寺庙怎么办 美甲彩绘胶干了怎么办 美甲彩绘胶稀怎么办 彩绘胶弄衣服上怎么办 彩绘胶买来太稠怎么办 做指甲没有底胶怎么办 交定金后发现房屋不合法怎么办 买车付了定金不想要了怎么办