AsyncTask介绍

来源:互联网 发布:2017淘宝答题入口 编辑:程序博客网 时间:2024/05/16 10:37


Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理。
首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。
?
Android为了降低这个开发难度,提供了AsyncTask。AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。

AsyncTask直接继承于Object类,位置为android.os.AsyncTask。要使用AsyncTask工作我们要提供三个泛型参数,并重载几个方法(至少重载一个)。

?

二、AsyncTask定义了三种泛型类型 Params,Progress和Result。
AsyncTask<Params, Progress, Result>

Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。
使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法:

doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
onPostExecute(Result)? 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回

有必要的话你还得重写以下这三个方法,但不是必须的:

onProgressUpdate(Progress…) ? 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
onPreExecute() ?????? 这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
onCancelled() ??????????? 用户调用取消时,要做的操作

AsyncTask的构造函数的参数设置需要看明白:AsyncTask<Params, Progress, Result>
??? Params对应doInBackground(Params...)的参数类型。而new AsyncTask().execute(Params... params),就是传进来的Params数据,你可以execute(data)来传送一个数据,或者execute(data1, data2, data3)这样多个数据。
??? Progress对应onProgressUpdate(Progress...)的参数类型;
??? Result对应onPostExecute(Result)的参数类型。
??? 当以上的参数类型都不需要指明某个时,则使用Void,注意不是void。不明白的可以参考上面的例子,或者API Doc里面的例子。

三、使用AsyncTask类,以下是几条必须遵守的准则:

Task的实例必须在UI thread中创建;
execute方法必须在UI thread中调用;
不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;
该task只能被执行一次,否则多次调用时将会出现异常;

//模拟下载进度public void getPicture() {    MyAsyncTask myAsyncTask = new MyAsyncTask(this);    myAsyncTask.execute("http://xxx.xxx.xx/file.mp3");//传入下载文件地址}

class MyAsyncTask extends AsyncTask<String, Integer, Boolean> {    ProgressDialog mProgressDialog;    Context mContext;    public MyAsyncTask(Context context) {        mContext = context;        mProgressDialog = new ProgressDialog(context);    }    protected void onPreExecute() {        super.onPreExecute();        mProgressDialog.show();        Logs.e("DownLoadTask >>>>>");    }   //后台执行    protected Boolean doInBackground(String... strings) {        String httpUrl = strings[0];//下载文件地址        Logs.e("doInBackground >>>>>");        int count = 0;        for (; count <= 100; count++) {            SystemClock.sleep(50);            publishProgress(count);        }        return true;    }   
  //主线程执行
protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); Logs.e("onProgressUpdate >>>>>"); mProgressDialog.setMessage("已经下载" + values[0] + "%"); } @Override protected void onPostExecute(Boolean aBoolean) { super.onPostExecute(aBoolean); mProgressDialog.dismiss(); Logs.e("onPostExecute aBoolean>>>>>" + aBoolean); if (aBoolean) { Toast.makeText(mContext, "下载成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(mContext, "下载失败", Toast.LENGTH_SHORT).show(); } } @Override protected void onCancelled() { super.onCancelled(); Logs.e("onCancelled >>>>>"); }}

0 0
原创粉丝点击