`
nanjingjiangbiao_T
  • 浏览: 2683256 次
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Android开发--AsyncTask异步任务(二)

 
阅读更多

一.什么是异步操作

异步操作是指把消耗时间的操作放在另一个线程内执行,变成两个线程独立并行执行的状态。通常涉及网络的操作大多数放在异步任务中。

二.异步任务AsyncTask

1.建立异步任务

public class FirstAsyncTask extends AsyncTask<Integer,Integer,String>{ //当然,这里的泛型类型根据需要可以是任何类型。

//参数1:定义的是doInBackground方法中接收参数的类型。

//参数2:定义onProgressUpdate方法中接收参数的类型。

//参数3:定义的是doInBackground的返回值类型以及onPostExcute方法接收参数的类型。

@override

protected void onPreExcute(){ //在excute()方法调用后首先执行。它是执行在UI线程中的,即主线程,所以在该方法内部可以对

......//UI线程中的控件进行操作。

}

@override

protected String doInBackground(Integer... param){ //在这个函数里的操作会在后台执行,即其内的代码在另一个线程中执行,不

//会影响当前线程。但该方法在异步线程中而非UI线程中,因此不能对UI中的控件

//进行操作。

//参数是变长的,可以是一个,也可以是多个。参数由主线程的excute()方法传入

...... //在这里写入需要独立执行的操作

publishProgress(int i); //用于发布更新方法,会触发onProgressUpdate方法

return str; //这个返回值返回给onPostExcute。

}

@override

protected void onProgressUpdate(Integer... values){ //这个方法也是在UI线程中执行的,所以在该方法内部可以对UI线程中的控

//件进行操作。该方法用于在异步任务的执行过程中,对用户进行提示,例

//如控制进度条等。

......

}

@override

protected void onPostExcute(String str){ //在doInBackground()方法执行后执行。它是执行在UI线程中的,即主线程,所以在该

...... //方法内部可以对UI线程中的控件进行操作。

}

}

2.在主线程中执行异步任务

FirstAsyncTask asyncTask=new FirstAsyncTask ();

asyncTask.excute(); //注意,这里的excute如果有值,比如excute(1000),则表示的是doInBackground的参数,含有一个值,则是

//doInBackground的第0个参数,含有两个值,则是doInBackground的第1个参数,如此类推。


AsyncTask与Handler的对比和具体的描述:

异步的轻量级实现;
AsynceTask简述:

1.功能类似于Handler,都是为了防止UI线程操作阻塞而衍生而来。

2.AsyncTask是Handler的一个轻量级实现,模型类似于IntentService于Service。都是为了更加方便操作。(因为一般的异步,我们都是开启一个子线程或是匿名线程,缺点就是样的实现对于线程的操作,控制是十分困难)

3.阐述下Handler,一般我们就认为Handler既一个Android消息处理器。默认情况下,他只接受当前线程的消息实例。
但是,当在一个多线程,比如子线程数据处理后更新Ui线程,此时只要存在Handler的指针,简单的说就是实例对象时,
消息的收发处理就能执行在不同的进程中了,这个也是我们常用到的异步处理手法。

4.从源代码中看AsyncTask类中有 线程池,同样也实例化了一个Handler对象。
说白了,AsyncTask只是对以上我们自己用handler,thread实现的异步做了一个很好的封装,使用到线程池对于线程的销毁和创建开销大大减小

综合了下:AsyncTask的异步处理相对于传统的handler+Thread组合,减少程序中线程过多开销过大。操作和管理更加方便。

AsyncTask的是实现:
和所有网上说的一样,该对象必须在UiThread中实例化,然后执行execute方法。
copy下:AsyncTask定义了三种泛型类型 Params,Progress和Result。
•Params 启动任务执行的输入参数,比如HTTP请求的URL。
•Progress 后台任务执行的百分比。
•Result 后台执行任务最终返回的结果,比如String。

AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,开发者需要实现一个或几个方法。在任务的执行过程中,这些方法被自动调用。
onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。
doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.

使用AsyncTask类,以下是几条必须遵守的准则:
1) Task的实例必须在UI thread中创建
2) execute方法必须在UI thread中调用
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法

4) 该task只能被执行一次,否则多次调用时将会出现异常



下面以一张图来说明异步操作的过程:

从图示中可以看出,只有doInBackground工作在另外一个线程中,所以可以在其他的回调方法当中实现对UI的更新。
下面以一个具体的实例介绍AsyncTask

这个例子实现的是在异步线程中更新进度条的进度:

实现这个例子需要三个类:

1.模拟耗时操作的类:

public class netOperator {
	public void operator(){
		try {
			Thread.sleep(1500);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

}

2.实现异步操作的类:

//生成该类的对象,并调用其execute方法之后
//1.首先执行的是onPreExecute方法
//2.其次执行的是doInBackground方法

/*
 * AsyncTask<Integer, Integer, String>三个参数的介绍
 * 1.Integer--标志了doInBackground的参数类型
 * 2.Integer--标志了onProgressUpdate的参数类型
 * 3.String--标志了doInBackground的返回类型和onPostExecute的参数类型
 */
public class ProgressBarAsyncTask extends AsyncTask<Integer, Integer, String>{
	private TextView textView;
	private ProgressBar progressBar;
	private Button button;

	public ProgressBarAsyncTask(TextView textView,ProgressBar progressBar,Button button){
		this.textView=textView;
		this.progressBar=progressBar;
		this.button=button;
	}
	
	//该方法并不运行在UI线程当中,所以在改方法中不能更新UI里面的东西,例如对其中的控件进行设置
	@Override
	protected String doInBackground(Integer... params) {
		// TODO Auto-generated method stub
		netOperator netOperator=new netOperator();
		int i=0;
		for(i=10;i<=100;i+=10){
			netOperator.operator();
			//用于发布更新
			publishProgress(i);
//			This method can be invoked from doInBackground(Params...) to publish updates 
//			on the UI thread while the background computation is still running. 
//			Each call to this method will trigger the execution of onProgressUpdate(Progress...) 
//			on the UI thread. onProgressUpdate(Progress...) will note be called 
//			if the task has been canceled.
		}
		return i+params[0]+"";
	}
	
	//该方法是在doInBackground方法执行完毕之后执行,且运行在UI线程当中,其中的参数result就是doInBackground的返回值
	@Override
	protected void onPostExecute(String result) {
		// TODO Auto-generated method stub
		super.onPostExecute(result);
		textView.setText("异步操作执行结束"+result);
		button.setText("异步测试结束!!!");
	}
	
	//该方法运行在UI线程当中,主要是在异步操作之前所做的一些准备工作
	@Override
	protected void onPreExecute() {
		// TODO Auto-generated method stub
		super.onPreExecute();
		textView.setText("开始执行异步操作。。。");
	}
	
	//在doInBackground方法执行过程中,每次调用publishProgress方法,都会触发该方法的执行
	@Override
	protected void onProgressUpdate(Integer... values) {
		// TODO Auto-generated method stub
		super.onProgressUpdate(values);
		int value=values[0];
		progressBar.setProgress(value);
	}

}

3.主函数的实现:

public class MainActivity extends Activity {
	private TextView textView;
	private ProgressBar progressBar;
	private Button button;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		textView=(TextView)findViewById(R.id.textview);
		progressBar=(ProgressBar)findViewById(R.id.progressbar);
		button=(Button)findViewById(R.id.button);
		button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				ProgressBarAsyncTask pTask=new ProgressBarAsyncTask(textView, progressBar,button);
				pTask.execute(1000);
				button.setText("测试中。。。");
			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}

}


分享到:
评论

相关推荐

    Android的AsyncTask异步任务

    本篇文章将深入探讨Android的AsyncTask异步任务,以及如何在实践中应用。 首先,Android是一个基于事件驱动的系统,主线程(UI线程)负责处理用户交互,而复杂的计算或网络请求等耗时操作应在后台线程中执行,以免...

    安卓拍照上传录像监控录屏相关-android录音上传到服务器上传使用AsyncTask异步任务.rar

    在提供的资源中,"android录音上传到服务器,上传使用AsyncTask异步任务.rar" 提到了使用AsyncTask来处理这一问题。下面,我们将深入探讨Android系统中的这些功能及其与AsyncTask的结合使用。 1. **拍照上传**: ...

    异步任务AsyncTask

    在Android开发中,异步任务(AsyncTask)是一种常见的处理耗时操作的方式,尤其是在主线程中需要执行网络请求、数据库操作或大型数据处理时。它能够避免UI线程被阻塞,提供更好的用户体验。让我们深入了解一下`...

    Android-详细解读AsyncTask的黑暗面以及一种替代方案

    在Android开发中,AsyncTask是一种常用的轻量级异步任务处理框架,它使得开发者可以在UI线程之外执行耗时操作,以避免应用因为阻塞主线程而引发的ANR(Application Not Responding)错误。然而,尽管AsyncTask简单...

    Android开发AsyncTask异步处理任务

    这个博文主要围绕Android开发中的AsyncTask展开,讨论了如何利用它来异步处理任务。 AsyncTask是Android提供的一个轻量级异步处理框架,适用于快速、简短的后台任务,例如网络请求、数据库操作等。它的核心设计思想...

    Android AsyncTask用法和异步加载图片.rar

    在Android应用开发中,异步处理是至关重要的,特别是在处理耗时操作如网络请求或大量数据计算时。Android提供了一种轻量级的机制来在后台执行这些任务,即`AsyncTask`。本资料包主要讲解了如何使用`AsyncTask`进行...

    安卓Android源码——android录音上传到服务器,上传使用AsyncTask异步任务.rar

    这个压缩包文件"安卓Android源码——android录音上传到服务器,上传使用AsyncTask异步任务.rar"包含了一个示例,它演示了如何利用Android SDK提供的API来录制音频,并通过AsyncTask异步任务将其上传到服务器。...

    Android用AsyncTask异步加载图片(新)

    在Android应用开发中,异步加载图片是一项常见的需求,特别是在处理大数据量的图像时,如在GridView或ListView中展示图片。`AsyncTask`是Android提供的一种轻量级的多线程解决方案,它允许开发者在后台执行耗时操作...

    安卓开发-android录音上传到服务器,上传使用AsyncTask异步任务.zip

    总结,安卓应用开发中的录音和文件上传功能涉及音频录制、文件操作、异步任务以及网络通信等多个方面,通过合理运用`AudioRecord`、`AsyncTask`和网络库,可以实现高效、稳定的录音上传功能。在实际开发中,还需要...

    Android 使用AsyncTask异步更新UI界面

    `AsyncTask`是Android SDK提供的一种轻量级的异步任务处理类,它简化了在后台线程中执行任务并在UI线程中更新结果的过程。`AsyncTask`包含三个泛型参数:`Params`、`Progress`和`Result`,分别代表输入参数类型、...

    AsyncTask异步任务三.rar

    在提供的"AsyncTask异步任务三"示例中,你将找到一个详尽的教程,演示如何在Android项目中使用AsyncTask来加载数据。这将帮助初学者理解异步编程的基本概念,以及如何在Android应用中有效地实现异步任务。通过实践这...

    Android AsyncTask异步处理下载网页

    在Android应用开发中,异步处理是至关重要的,特别是在涉及到耗时操作如网络请求、数据库操作或文件I/O时。Android提供了一种便捷的机制,名为`AsyncTask`,用于在后台线程执行这些任务,同时允许在主线程更新UI。`...

    android录音上传到服务器,上传使用AsyncTask异步任务.zip

    这个压缩包文件"android录音上传到服务器,上传使用AsyncTask异步任务.zip"包含了一个实现这一功能的源码示例。以下是对其中涉及的关键知识点的详细解释: 1. **Android录音**: Android系统提供了`MediaRecorder`...

    Android--开发-- Gallery实现异步加载网络图片 并只加载当前停止页面图.rar

    - 在Android中,我们可以使用`AsyncTask`、`Handler`、`IntentService`或第三方库如`Volley`、`Picasso`、`Glide`等实现异步加载。 2. **使用`AsyncTask`**: - 创建一个继承自`AsyncTask`的类,定义`...

    AsyncTask异步加载图片

    在Android开发中,异步加载图片是一个常见的需求,特别是在处理用户界面时,为了提供良好的用户体验,我们需要在后台线程执行耗时操作,如从网络下载图片,然后在UI线程更新视图。`AsyncTask`是Android提供的一个轻...

    一个AsyncTask异步任务的操作实例

    在这个“一个AsyncTask异步任务的操作实例”中,我们将深入探讨AsyncTask的工作原理、使用方法以及如何在实际项目中应用。 1. **AsyncTask基本结构**: AsyncTask由三个泛型参数定义:`Params`, `Progress`, 和 `...

    Android Handler AsyncTask 异步加载

    总的来说,理解并熟练掌握Handler和AsyncTask是Android开发的基础,它们能帮助开发者有效地处理异步任务,提高应用的性能和用户体验。在实际开发中,根据具体场景选择合适的方法,同时关注Android API的变化,适时...

    Android高级应用源码-android录音上传到服务器,上传使用AsyncTask异步任务.zip

    这个“Android高级应用源码-android录音上传到服务器,上传使用AsyncTask异步任务.zip”提供的代码示例,聚焦于这一功能的实现,主要涉及到以下几个核心知识点: 1. **Android录音API**:在Android中,我们可以使用...

    安卓Android源码——android录音上传到服务器,上传使用AsyncTask异步任务.zip

    在这个项目中,开发者使用了Android的原生API来完成录音,并通过AsyncTask异步任务来实现后台上传,以避免阻塞用户界面。下面将详细解析这一过程中的关键知识点。 1. **录音功能**: - Android提供了`...

Global site tag (gtag.js) - Google Analytics