安卓多线程#2--如何使用类AsyncTask实现异步耗时操作 推荐
2013-08-18 19:46
495 查看
上一篇博文讲述了ANR异常以及使用handler类解决异常。这次我将给大家介绍另外一种处理耗时操作的方法。异步处理耗时操作是当时比较流行的方法,所以能完全掌握此类的使用是非常重要。至于为什么会流行,下面我就先给大家介绍使用AsyncTask的好处
1:使用AsyncTask的好处
当我们处理耗时操作时候,比如下载这时候我们就要启动一个线程,假设我们有几百条线程要启动。我给大家举个例子。线程启动就像扫把,启动一个就等于一把新扫把,当我们用完的时候就丢掉,等到下次再用的时候就在买一把新扫把,如此循环。这样就等于浪费资源。而使用AsyncTask就想一个放10几个扫把的地方。每次我们用了扫把后就放回去,等下次某个人需要用的时候继续循环使用这个扫把,这样以来就节省了系统资源。现在大家知道AsyncTask类的好处了吧,能节省系统资源对我们做好一个大项目来说是至关重要的。
2:AsyncTask的使用。
(1):我给大家做个例子,有一个进度条,一个文本,一个按钮启动下载,当点击下载时候文本就会根本当前进度条进度显示百分比的进度,如下图
(2):写一个内部类继承AsyncTask,其实第一个方法是必须实现的,后面2个是我手动调用的,具体代码如下
然后第三个方法onPostExecute就会接受到doInBackgroud返回的结果值。
(3):在鉴定匿名类里面我们就启动这个线程池,由于之前我定义了启动线程池传入的参数为String类型,所以现在我就传入了一个String,代码如下:(这里这个参数目前没用只是为了说明前面的问题
(4):然后在doInBackgroud方法处理进度(这里设定每100毫秒增加一个进度然后调用publishProgress()方法来在主线程增加进度条进度和更新文本百分比进度),代码如下
1:使用AsyncTask的好处
当我们处理耗时操作时候,比如下载这时候我们就要启动一个线程,假设我们有几百条线程要启动。我给大家举个例子。线程启动就像扫把,启动一个就等于一把新扫把,当我们用完的时候就丢掉,等到下次再用的时候就在买一把新扫把,如此循环。这样就等于浪费资源。而使用AsyncTask就想一个放10几个扫把的地方。每次我们用了扫把后就放回去,等下次某个人需要用的时候继续循环使用这个扫把,这样以来就节省了系统资源。现在大家知道AsyncTask类的好处了吧,能节省系统资源对我们做好一个大项目来说是至关重要的。
2:AsyncTask的使用。
(1):我给大家做个例子,有一个进度条,一个文本,一个按钮启动下载,当点击下载时候文本就会根本当前进度条进度显示百分比的进度,如下图
(2):写一个内部类继承AsyncTask,其实第一个方法是必须实现的,后面2个是我手动调用的,具体代码如下
class MyTask extends AsyncTask<String, Integer, String> { @Override protected String doInString... params) { publishProgress(values); return null; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); } @Override protected void onPostExecute(String result) { super.onPostExecute(result); } }首先这个类需要有3个类型,第一个params类型就是等会我们启动线程池需要传入的参数类型,一般都是传入网址,所以我定义它为String类型,当此类型定义完成后,doInBackgroud方法中的参数类型就是同样是String类型(doInBackground方法想当于线程的run方法,是在子线程处理的)。它会获得我们传入的网址参数。第二个Progress类型就是我们在处理耗时操作过程中如果需要处理主线程的东西时候,就可以在doInBackground方法中调用publishProgress(values)方法激活第二个重写的方法onProgressUpdate()方法(这个方法是在main线程中的执行的因此可以操作UI对象.values一般都是传入进度参数。第三个参数就是当我们处理好了doInBackgroud的方法,他会返回一个结果,这个结果的类型,这里我给它定义为String,这时候doInBackgroud方法返回值自动变为String类型
然后第三个方法onPostExecute就会接受到doInBackgroud返回的结果值。
(3):在鉴定匿名类里面我们就启动这个线程池,由于之前我定义了启动线程池传入的参数为String类型,所以现在我就传入了一个String,代码如下:(这里这个参数目前没用只是为了说明前面的问题
new MyTask().execute("www.baidu.com");
(4):然后在doInBackgroud方法处理进度(这里设定每100毫秒增加一个进度然后调用publishProgress()方法来在主线程增加进度条进度和更新文本百分比进度),代码如下
@Override protected String doInString... params) { //没100毫秒进度+1,总共执行100次 for (int i = 0; i < 100; i++) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } //激活onProgressUpdate并将进度i传入 publishProgress(i); } return "下载完成"; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); //更新进度条进度 mProgressBar.setProgress(values[0]); //更新百分比进度 mTextView.setText(values[0]+"%"); }(4):当下载完成以后我们在onPostExecute()方法中将文本内容更新为下载完成
@Override protected void onPostExecute(String result) { super.onPostExecute(result); mTextView.setText(result); }大功告成。这就是使用AsyncTask类实现异步耗时操作的用法,我会吧这次程序的完整代码上传到我的上传,大家如果有需要的话可以去下载,下一次我会结合ListView和AsyncTask做一个下载歌曲的小项目
相关文章推荐
- spring使用Async实现异步或者延迟的操作
- 如何使用一个指针来实现双向链表操作
- 关于安卓Web App如何实现推送的努力(使用谷歌gcm)
- 如何:实现使用后台操作的窗体
- 市面上所有号称"虚拟机","防火墙"的实时监控杀毒软件无一不是使用的IFSHOOK技术.但是同时也有一些朋友不断写MAIL给我打听如何实现读写的监控.下面给出用VTOOLSD写的代码.也就是所有实时杀毒软件的奥秘.同时,很多拦截文件操作的软件,例如对目录加
- C# 使用多线程如何传递两个以上参数的实现方法(附示例) 推荐
- 如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
- 使用Jquery+Ajax+Json如何实现分页显示附JAVA+JQuery实现异步分页
- 两个耗时的异步操作如何回调主线程
- C#使用异步实现 IO 操作
- 异步委托(APM)使用Func异步操作,处理耗时操作
- 事件异步(EAP)使用事件异步处理一些耗时操作
- 使用redux-thunk实现异步操作的中止
- 安卓开发培训(3.2 使用SharedPreferences实现Android数据读写操作)
- 使用python的docker-py实现docker的api操作 推荐
- 如何:使用回调方法实现异步 Web 服务客户端
- 如何使用单机单网卡实现公司内、外网访问 推荐
- 使用jquery 如何编写实现请求本页面的无刷新操作
- C# 多线程与异步操作实现的探讨(推荐)