文章目录

一、相关文章

二、前言

三、类和方法的使用

1、写AsyncTask的子类

2、主要方法

3、使用注意点

四、项目实战例子

1、捋一下AsyncTask基本流程

2、写代码


一、相关文章

Android专题之AsyncTask(一)基本概念介绍

Android专题之AsyncTask(二)简单AsyncTask例子解决线程阻塞

Android专题之AsyncTask(三)异步方法操作之进度条

 

二、前言

今天继续迁移整理AsyncTask系列文章,迁移整理速度有点慢啊!最近打篮球、跑步等运动还是挺累的,随着年龄的增长越发感觉身体素质不行啦!虽然减肥10斤成功,但是坚持控制饮食、有规律的运动还是需要毅力的。同理可得就像你如果能坚持写博客一样需要坚持、毅力啊!哈哈,终于拉回来了,废话少说步入正题。在本系列的上一篇文章中,我们学习了讲解了AsyncTask解决线程阻塞问题的一个简单例子,还没有看过上一篇文章的朋友,可以去阅读Android专题之AsyncTask(二)简单AsyncTask例子解决线程阻塞 接下来这篇文章主要讲AsyncTask一些主要方法的使用和有关进度条的一个简单例子。

同样先整理一个demo分享给大家,点击可下载我的源码:03_AsyncTask_异步方法操作之进度条

 

三、类和方法的使用

1、写AsyncTask的子类

继承AsyncTask类,AsyncTask是一个抽象类通常用于被继承。

继承AsyncTask需要指定如下三个泛型参数:

Params:启动任务时execute方法输入的参数类型。即对应doInBackground方法所传入的参数类型

Progress:后台任务执行中返回进度值的类型。即对应onProgressUpdate方法所传入的参数类型

Result:后台任务执行完成后返回结果的类型。即对应doInBackground的返回值类型 ,也是onPostExecute方法所传入的参数类型

例如:你可继承AsyncTask类,重写它的一些方法来感受下

public class TestAsyncTask extends AsyncTask{@Overrideprotected void onPreExecute() {// TODO Auto-generated method stubsuper.onPreExecute();}@Overrideprotected String doInBackground(Integer... arg0) {//必须重写的方法// TODO Auto-generated method stubreturn null;}@Overrideprotected void onProgressUpdate(Double... values) {// TODO Auto-generated method stubsuper.onProgressUpdate(values);}@Overrideprotected void onPostExecute(String result) {// TODO Auto-generated method stubsuper.onPostExecute(result);}}

 

2、主要方法

onPreExecute方法:【运行在UI线程中

执行后台耗时操作前被调用,通常用于进行初始化操作。该方法运行在UI线程当中,主要用于进行异步操作之前的UI准备工作。在这个方法当中,你可以对UI当中的一些控件,来进行一些初始化操作

doInBackground方法:

必须重写的方法。异步执行后台线程要完成的任务,耗时操作将在此方法中完成。主要用于进行异步操作,该方法并不运行在UI线程当中,所以在该方法当中,不能对UI当中的控件进行设置和修改。你如果想操作UI里面的控件,就调用publishProgress方法,来发布一次更新。每次调用,它就会触发onProgressUpdate方法,来执行操作

onProgressUpdate方法:【运行在UI线程中

当在doInBackground方法中每次调用publishProgress方法更新任务执行进度后,都会触发该方法。通过此方法我们可以知晓任务的完成进度。用于在异步任务执行的过程当中,对用户进行提示,例如控制进度条等。在这个方法当中,你可以对UI当中的一些控件,来进行一些更新操作

onPostExecute方法:【运行在UI线程中

主要用于将异步任务执行的结果展示给用户。在doInBackground方法执行结束之后再运行onPostExecute方法,并且onPostExecute方法运行在UI线程当中。并将doInBackground方法返回的值传入此方法,通过此方法进行UI的更新,最终UI的显示效果展示给用户。

 

3、使用注意点

1、doInBackground方法是必须重写的方法,其他三个方法不是必须,我的使用习惯继承AsyncTask类以后就都重写了吧!AsyncTask被重写的四个方法是系统自动调用的,不应手动调用。

2、如上面的四个主要方法已标注,只有doInBackground方法不是运行在UI线程,其他三个方法都运行在UI线程中,也就说其他三个方法都可以进行UI控件的更新操作

3、必须在UI线程中创建AsyncTask的实例,只能在UI线程中调用AsyncTask的execute方法。而且每个AsyncTask只能被执行一次,也就是调用一次execute方法,多次执行将会引发异常。

 

四、项目实战例子

下面通过代码演示一个类似我在公司项目当中做的典型的异步处理的实例,同样“代码之前,思路先行” 如果有李健的感觉就好啦,哈哈写着写着兴奋了开始不要脸了!

1、捋一下AsyncTask基本流程

(1)创建AsyncTask实例,执行execute方法

(2)执行onPreExecute方法

(3)执行doInBackground方法

执行网络操作

执行publishProgress方法,触发执行onProgressUpdate方法更新UI给用户进度提示

网络操作完毕,把doInBackground方法的返回值传递给onPostExecute方法

doInBackground方法执行结束

(4)执行onPostExecute方法

 

2、写代码

(1)代码简单介绍

A、线程睡眠,写一个模拟网络操作的类

//模拟访问网络的操作public class NetOperator {public void operate(){try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

B、定义AsyncTask异步类操作

public class ProgressBarAsyncTask extends AsyncTask {private TextView textView = null;// 文本框private ProgressBar progressBar = null;// 进度条private Button btnUpdate = null;//更新按钮public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar,Button btnUpdate) {this.textView = textView;this.progressBar = progressBar;this.btnUpdate = btnUpdate;}@Overrideprotected void onPreExecute() {textView.setText("开始更新。。。");}@Overrideprotected String doInBackground(Integer... param) {NetOperator netOperator = new NetOperator();int i = 0;for (i = 10; i <= 100; i += 10) {netOperator.operate();publishProgress(i);// 用于发布更新消息}return i + param[0].intValue() + "";// 传值返回值,doInBackground执行完毕。}@Overrideprotected void onProgressUpdate(Integer... values) {int value = values[0]; progressBar.setProgress(value);textView.setText("更新中。。。");}@Overrideprotected void onPostExecute(String result) {textView.setText("更新完毕。。。");//btnUpdate.setEnabled(true);//progressBar.setProgress(0);//textView.setText("");}}

C、在MainActivity定义实例化三个组件文本、进度条、按钮,然后调用ProgressBarAsyncTask实例和execute方法

 

(2)效果演示:

这个是网络更新下载的一个效果演示,比如你要去服务器端去下载更新一些文件

Android专题之AsyncTask(三)异步方法操作之进度条_第1张图片

 

 

 

 

更多相关文章

  1. Android在网络中与JavaWeb的项目进行交互的方法(Webservice)
  2. android app耗电分析方法
  3. Android真机测试,连接到本地服务器的方法
  4. 电池驱动调试总结,电池服务+电量计驱动+调试方法
  5. Android应用程序通用自动脱壳方法研究
  6. 文件操作二

随机推荐

  1. android 学习视频汇总
  2. 插画人物的光影怎么画?零基础绘画光影教程
  3. Linux-安装ifconfig
  4. 如何练习画线稿?初学者画线稿步骤
  5. 解决:Failed to download metadata for re
  6. PHP最新的插件化后台管理系统真的蛮好用
  7. 如何绘制手部?漫画人物手部简单画法
  8. Android屏蔽HOME键
  9. Android(安卓)Button,TextView的显示大小
  10. RxJava操作符