Android多线程篇(下)-安卓基础知识整理
来源:互联网 发布:快刀抢票软件 编辑:程序博客网 时间:2024/05/17 06:25
在上篇我总结了关于多线程使用的一些基本知识,看完应该可以对异步消息处理有一定的了解并且可以简单地使用了。不过Android还提供了另外一些好用的工具——AsyncTask。尽管对异步消息处理不怎么熟悉,也可以十分简单地通过使用AsyncTask来从子线程切换到主线程。当然了AsyncTask背后的原理实际上也是异步消息处理机制的,只是Android帮我们做了很好的封装而已。
为了更好的使用AsyncTask,我们先来了解一下它。AsyncTask是一个抽象类,我们要使用它需要新建自己的类来继承他并且重写它的一些方法。在继承的时候我们可以指定3个泛型参数,这三个参数用途如下:
- Params:在执行AsyncTask是需要传入的参数,可用于在后台任务中使用。
- Progress:后台任务执行时,如果需要在界面上显示当前的进度,则使用这里置顶的泛型作为进度单位。
- Result:当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型。
然后我们就可以这样来定义一个自己的类
class MyTask extends AsyncTask<void, Integer, Boolean>{ ...}
这里我定义了第一个是void,意思是不需要传入参数,如果需要也可以更改为其他,第二个为Integer,表示用整型数来作为进度的单位,而Result则指定为Boolean,表示返回结果为布尔值(true/false)
然后我们就需要重写一下它的一些方法了,这里我列举一下4个经常需要重写的四个方法:
- onPreExecute()
这个方法会再后台任务开始之前调用,用于进行一些界面上的初始化操作,比如显示一个进度条对话框表示后台任务正在进行。 - doInBackground(Params…)
这个方法看名字就知道了吧,我们的耗时操作应该放在这里面来处理。不过需要注意的是这里不可以进行UI操作,若需要,比如反馈当前任务的进度,可以借助下面的onProgressUpdate(Progress…)来完成。 - onProgressUpdate(Progress…)
当在后台任务中调用publishProgress(Progress…)之后,onProgressUpdate(Progress…)方法就会很快地被调用,这个方法中携带的参数就是后台任务中传递过来的,在这里可以对UI进行操作。7 - onPostExecute(Result…)
当后台任务执行完并return返回时,这个方法就很快被调用了。返回的数据会作为参数传递到此方法中,可以在这里进行UI操作,比如关掉进度条对话框或者提醒任务完成了。
基本了解之后我们就可以这样来定义一个比较完整的AsyncTask了(假设是下载功能的)
class DownloadTask extends AsyncTask<Void, Integer, Boolean> { @Override protected void onPreExecute() { progressDialog.show();//显示进度对话框,假设已定义。 } @Override protected Boolean doInBackground(Void... params) { try{ while (true){ int downloadPercent = doDownload();//这是一个虚构的方法,返回下载的进度 publishProgress(downloadPercent); if (downloadPercent >= 100){ break; } } }catch (Exception e){ return false; } return true; } @Override protected void onProgressUpdate(Integer... values) { //UI操作,更新下载进度 progressDialog.setMessage("Download" + values[0] + "%"); } @Override protected void onPostExecute(Boolean aBoolean) { progressDialog.dismiss();//关闭进度对话框 if (aBoolean){ Toast.makeText(context,"Download succeeded",Toast.LENGTH_SHORT).show(); }else { Toast.makeText(context,"Download failed",Toast.LENGTH_SHORT).show(); } }}
要启动这个任务,只需一行:
new DownloadTask().execute();
以上就是AsyncTask的基本用法了。简直比Handler方便多了有木有。
好了就写这么多吧。
注:本文内容均是《第二行代码》(第二版)知识。
阅读全文
0 0
- Android多线程篇(下)-安卓基础知识整理
- Android多线程篇(上)-安卓基础知识整理
- 安卓基础知识整理
- 多线程基础知识整理(一)
- 网络的使用-安卓基础知识整理
- Java多线程基础知识整理
- android基础知识整理(1)
- 安卓app设计规范整理和Android APP设计篇
- 安卓app设计规范整理和Android APP设计篇
- 整理出来的android(安卓)开发框架
- 整理出来的android(安卓)开发框架
- 安卓源码(Android 5.1 )目录结构整理
- android-基础知识整理--四大组件(未完)
- android-基础知识整理-数据存储(未完)
- Android 面试基础知识整理
- Android基础知识整理
- Android:基础知识整理
- java基础知识(多线程篇)
- iOS 从0到1搭建高可用App框架
- Linux进程与线程概述
- python: append & extend 异同
- 二叉树
- 亚洲诚信:钓鱼网站飙升居然因为浏览器...
- Android多线程篇(下)-安卓基础知识整理
- Swift3.0基础之详细讲解Closure闭包结构的使用
- Myeclipse2016 安装与破解
- 观察者模式
- Mat
- 无法访问中文维基百科
- android studio 编译时遇到的各种问题(持续记录)
- osg dragger 颜色发生变化
- SQL-外联接默认的属性