Android 异步任务

1.异步任务(AsyncTask)简介
Android异步任务(AsyncTask)是一个抽象类,通常用于被继承,继承AsyncTask时需要指定如下三个泛型参数。
1.1)Params:启动任务执行的输入参数。比如HTTP请求的URL。
1.2)Process:后台任务完成的进度值的。比如进度条的百分比。
1.3)Result:后台执行任务完成后返回结果。比如String,Boolean。
2.使用AsyncTask的步骤
2.1)创建AsyncTask的子类,并未三个泛型参数指定类型。如果某个泛型参数不需要制定类型,则可将它指定为空。
2.2)实现AsyncTask的如下方法
2.2.1)onPreExecute():该方法将在执行后台耗时操作前被调用。通常该方法用于完成一些初始化的准备工作,比如在界面上显示进度条。
2.2.2)doInBackground(Params…):重写该方法就是后台线程将要完成的任务。任务一旦完成就可以通过return语句来将任务的执行结果返回,如果AsyncTask的第三个泛型参数指定是void,就可以不返回任务执行结果。该方法可以调用publicProgress(Params… Values)方法更新任务的执行速度。
2.2.3)onProgressUpdate(Params… Values):在doInBackground()方法中调用publicProcess()方法更新任务的执行进度后,将会触发此方法。
2.2.4)onPostExecute(Result result):当doInBackground()完成后并通过return语句返回时,系统会自动调用onPreExecute()方法,并将doInBackground()方法的返回值传给该方法。
2.3)调用AsyncTask子类的实例的execute(Params… params)开始执行耗时任务。
3.使用AsyncTask注意点:
3.1)必须在UI线程中创建AsyncTask的实例。
3.2)必须在UI线程中调用AsyncTask的execute()方法。
3.3)AsyncTask的onPreExecute()、onPostExecute(Result result)、doInBackground(Params…)、onProgressUpdate(Params… Values)方法,不应该由程序员代码调用,而是由Android系统负责调用。
3.4)每个AsyncTask只能被执行一次,多次调用将会引发异常。
4.代码如下:

public class MainActivityClass extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        try {
            DownLoadTask task = new DownLoadTask();
            task.execute(new URL("http://www.baidu.com"));//开始执行异步任务
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }


    class DownLoadTask extends AsyncTask<URL,Integer,Boolean>{

        ProgressDialog progressDialog;

        @Override
        protected void onPreExecute() {
            //准备工作,初始化进度条 对进度条设置.....
            progressDialog = new ProgressDialog(MainActivityClass.this);
            progressDialog.show();
        }

        @Override
        protected Boolean doInBackground(URL... params) {
            int downloadPrecent = doDown(params[0]);//doDown()虚构的一个方法
            publishProgress(downloadPrecent);

            return true;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            //进度条显示
            progressDialog.setMessage(values[0] + "%");
        }

        @Override
        protected void onPostExecute(Boolean result) {
            progressDialog.dismiss();
            if (result){
                //下载完成
            }else{
                //下载失败
            }
        }
    }
}

本代码简单介绍异步任务的三个泛型参数及重写其中5个方法的执行过程。从代码中可以看出在doInBackground()方法中去执行具体的耗时任务,在onProgressUpdate(Params… Values)方法中进行UI操作(比如进度条显示),在onPostExecute(Result result)方法中执行一些任务的收尾工作。
5.线程与异步任务区别
线程的介绍大家可以参考我的上篇博客http://blog.csdn.net/qq_30960163/article/details/52244304
Thread是Java早期为实现多线程而设计的,比较简单不支持concurrent中很多特性在同步和线程池类中需要自己去实现 很多的东西,对于分布式应用来说更需要自己写调度代码,而为了Android UI的刷新Google引入了Handler和Looper机制,它们均基于消息实现,有时可能消息队列阻塞或其他原因无法准确的使用。AsyncTask优点安全,简单。但缺点也是有的比如一旦线程开启即dobackground方法执行后无法给线程发送消息,仅能 通过预先设置好的标记来控制逻辑,当然可以通过线程的挂起等待标志位的改变来通讯,对于某些应用Thread和Handler以及Looper可能更灵 活。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值