网易博客迁移:Android专题之AsyncTask(三)异步方法操作之进度条

版权声明:本文为博主原创文章,不得随意转载,转载请注明出处!!! https://blog.csdn.net/YuDBL/article/details/84197163

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

类和方法的使用

1、写AsyncTask的子类

继承AsyncTask类,AsyncTask<Params,Progress,Result>是一个抽象类通常用于被继承。

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

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

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

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

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

public class TestAsyncTask extends AsyncTask<Integer, Double, String>{
	
	@Override
	protected void onPreExecute() {
		// TODO Auto-generated method stub
		super.onPreExecute();
	}
	@Override
	protected String doInBackground(Integer... arg0) {//必须重写的方法
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	protected void onProgressUpdate(Double... values) {
		// TODO Auto-generated method stub
		super.onProgressUpdate(values);
	}
	@Override
	protected void onPostExecute(String result) {
		// TODO Auto-generated method stub
		super.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的显示效果展示给用户。

使用注意点

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 block
			e.printStackTrace();
		}
	}
}

B、定义AsyncTask异步类操作

public class ProgressBarAsyncTask extends AsyncTask<Integer, Integer, String> {

	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;
	}

	@Override
	protected void onPreExecute() {
		textView.setText("开始更新。。。");
	}

	
	@Override
	protected 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执行完毕。

	}

	@Override
	protected void onProgressUpdate(Integer... values) {
		int value = values[0]; 
		progressBar.setProgress(value);
		textView.setText("更新中。。。");
	}

	@Override
	protected void onPostExecute(String result) {
		textView.setText("更新完毕。。。");
//		btnUpdate.setEnabled(true);
//		progressBar.setProgress(0);
//		textView.setText("");
	}

}

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

(2)效果演示:

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

源码下载:03_AsyncTask_异步方法操作之进度条

猜你喜欢

转载自blog.csdn.net/YuDBL/article/details/84197163