一个例子谈谈AsyncTask的用法

题记:搞了半年的所谓J2EE开发,现在重新加入Droid的前端开发。很多东西都忘记了,现在一个个复习起上来。第一个当然要复习AsyncTask的用法。

AsyncTask主要方法的梳理:

执行次序 执行时机 方法名称 调用方
1 异步任务执行前 onPreExecute UI线程
2 异步任务执行中 doInBackground 后台线程
3 异步任务执行中 publishProgress 后台线程
4 异步任务执行中 onProgressUpdate UI线程
5 异步任务执行后 onPostExecute UI线程
例子:

UI线程(MainActivity.java):

启动AsyncTask。

package com.example.asynctaskexample;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ProgressBar;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		ProgressBar myProgressBar=(ProgressBar)findViewById(R.id.progress_horizontal);
		/**
		 * 启动异步任务,并传入"Begin","End"值演示UI线程向后端线程传值的情况
		 */
		new MyAsyncTask(myProgressBar, getApplicationContext()).execute("Begin","End");
	}

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

}

后端线程( MyAsyncTask.java ):

定义异步线程的处理逻辑

package com.example.asynctaskexample;

import android.content.Context;
import android.os.AsyncTask;
import android.os.Debug;
import android.util.Log;
import android.widget.ProgressBar;
import android.widget.Toast;

/**
 * AsyncTask<Params, Progress, Result>
 * 
 * Params定义传入异步任务的参数类型。如本例就是,String
 * 传入异步任务的参数,由UI线程调用execute()方法传入,由后台线程调用doInBackground()方法获取
 * 
 *  Progress定义异步任务执行过程中UI线程与后台线程之间传递的参数的类型。如本例就是,Integer
 * 后台线程调用publishProgress()方法并传入参数,UI线程调用onProgressUpdate()方法并获取参数值
 * 
 * Result定义异步任务执行结束后,后台线程向UI线程反馈执行结果时传递的参数类型。如本例就是,String
 * 后台线程执行doInBackground()方法结束后,通过返回值向UI线程反馈执行结果,UI线程调用onPostExecute()方法
 * 并通过参数获取反馈结果
 */
public class MyAsyncTask extends AsyncTask<String, Integer, String> {	
	/**
	 * 各常用方法使用时机:
	 * 
	 * 执行次序	   执行时机	     方法名称	    调用方
*1	      异步任务执行前	onPreExecute	UI线程
*2	      异步任务执行中	doInBackground	后台线程
*3	      异步任务执行中	publishProgress	后台线程
*4	      异步任务执行中	onProgressUpdate	UI线程
*5	      异步任务执行后	onPostExecute	    UI线程
	 * 
	 */
	/**
	 * MainActivity的进度条
	 */
	ProgressBar myprogressbar=null;
	/**
	 * MainActivity的上下文
	 */
	Context mycontext=null;
	
	public MyAsyncTask(ProgressBar progressbar,Context context) {
		// TODO Auto-generated constructor stub
		myprogressbar=progressbar;
		mycontext=context;
	}
	
	@Override
	protected void onPreExecute() {
		// TODO Auto-generated method stub
		super.onPreExecute();
		myprogressbar.setProgress(0);
		Toast.makeText(mycontext,"进度条开始加载...",Toast.LENGTH_SHORT).show();
	}
	

	@Override
	protected String doInBackground(String... params) {
		// TODO Auto-generated method stub
		String ret=null;
		/**
		 * 通过Begin,End演示多参数传值
		 */
		String Begin=params[0];
		String End=params[1];
		Log.d("Kaiwii_Test", Begin);
		/**
		 * 模拟耗时步骤
		 */
		for(int i=0;i<10;i++){
			/**
			 * 后台线程向UI线程发布进度状态i
			 */
			publishProgress(i);
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		Log.d("Kaiwii_Test", End);
		ret="更新完毕……";
		return ret;
	}
	
	/**
	 * UI线程通过参数result获得后端线程执行doInBackground()后的返回值
	 */
	@Override
	protected void onPostExecute(String result) {
		// TODO Auto-generated method stub
		super.onPostExecute(result);
		Toast.makeText(mycontext,result,Toast.LENGTH_SHORT).show();
		//myprogressbar.setProgress(myprogressbar.getMax());
	}
	
	@Override
	/**
	 * UI线程从后端线程获取状态值values,并且 UI线程根据状态值values
	 * 更新进度条状态
	 */
	protected void onProgressUpdate(Integer... values) {
		// TODO Auto-generated method stub
		super.onProgressUpdate(values);
		int progress=myprogressbar.getMax()/10*(values[0]+1);
		Log.d("Kaiwii_Test", "Progress"+progress);
		myprogressbar.setProgress(progress);
	}
	
	


}




   

你可能感兴趣的:(android)