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 >>>>>"); }}
- AsyncTask介绍
- AsyncTask介绍
- AsyncTask介绍
- AsyncTask介绍
- AsyncTask介绍
- AsyncTask介绍
- AsyncTask介绍
- AsyncTask介绍
- AsyncTask介绍
- AsyncTask介绍
- android AsyncTask介绍
- android AsyncTask介绍
- AsyncTask 介绍以及应用
- android AsyncTask介绍
- android AsyncTask介绍
- android AsyncTask介绍
- Android之AsyncTask介绍
- android AsyncTask介绍
- LeetCode-35:Search Insert Position
- 机房重构登录问题—拒绝访问
- JAVA中的反射机制
- 内部类
- 南阳oj55懒省事的小明
- AsyncTask介绍
- Android——AsyncTask
- HDU 5512 Pagodas (GCD博弈 + 2015ACM/ICPC亚洲区沈阳站-重现赛)
- Codeforces-612C-Replace To Make Regular Bracket Sequence 【stack】
- 1.最大公约数和最小公倍数
- CSS3:伪类前的冒号和两个冒号区别
- 前端学习资源汇总------------持续更新
- Redis高级实用命令详解--安全和主从复制
- 括号配对 栈