Android异步任务之AsyncTask基本使用

1.Asynctask 介绍

异步任务类。任务在后台线程上运行,结果在UI线程上显示。

一个抽象类。需要子类来实现。

使得使用UI 线程更加正常和简单。

就是一个封装过的后台任务类。


2.详细介绍
(1)三种泛型参数
Params:执行之前传入的参数,比如Http请求的URL;
Progress:后台运行时更新的参数(执行的百分比);
Result:执行之后返回的参数(结果)。
(2)要重写的方法
doInBackgroud:后台执行,比较耗时的操作都可以放在这个里面。这里不能直接操作UI。在后台执行,完成任务的主要工作,通常需要较长时间。在执行过程中可以调用publishProgress()来更新任务进度。
onPostExecute:此方法在主线程内执行,任务执行的结果作为此方法的参数。在这里可以处理UI。
(3)别的方法
onProgressUpdate:使用进度条来增加用户的体验。在主线程内执行,用于显示任务执行进度。
onPreExecute:最终用户调用execute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度条对话框。
onCancelled:用户调用取消时,要做的操作。

3.准则
(1)AsyncTask实例必须在UI Thread中创建;
(2)execute方法必须在UI Thread中调用;
(3)不要手动的调用 onPreExecute,doInBackgroud,onProgressUpdate,onPostExecute这几个方法;
(4)该Task只能被执行一次,否则多调用几次会出现异常。

4.说明
doInBackgroud方法在后台线程执行,不能操作UI。
onPreExecute,onProgressUpdate,onPostExecute方法在UI Thread中调用,在其中能够操作UI。
doInBackgroud的返回值传递给onPostExecute。

5.状态
有3种状态:
PENDING
RUNNING
FINISHED

6.AsyncTask 与线程及线程池的关系
AsyncTask会开启一个新线程,使用线程池技术。

7.实例
(1)布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/showBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/show" />

    <Button
        android:id="@+id/hideBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hide" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:visibility="invisible"/>

    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="?android:attr/progressBarStyleHorizontal"
        android:visibility="invisible"
        android:max="10" />

</LinearLayout>
(2)耗时操作
public class LongTimeOperate {
	
	//模拟耗时操作
	public void operate(){
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
(3)AsyncTask子类
public class MyAsyncTask extends AsyncTask<Integer, Integer, String> {

	private ProgressBar progressBar = null;
	private TextView textView = null;
	private LongTimeOperate operate = null;

	public MyAsyncTask() {

	}

	public MyAsyncTask(ProgressBar progressBar, TextView textView) {
		this.progressBar = progressBar;
		this.textView = textView;
	}

	//后台执行任务,参数是在execute方法中传递进来,onPreExecute方法执行后执行此方法
	@Override
	protected String doInBackground(Integer... arg0) {
		// TODO Auto-generated method stub
		int value = arg0[0];
		Log.d("zmq","doInBackground value = "+value);
		for (int i = 0; i < value; i++) {
			operate.operate();
			publishProgress(i);
		}
		return "任务结束啦";
	}

	//后台任务结束后,调用UI线程,result是doInBackground中返回的值,在doInBackground后执行
	@Override
	protected void onPostExecute(String result) {
		// TODO Auto-generated method stub
		super.onPostExecute(result);
		textView.setText(result);
	}

	// 初始化以及设置一些任务,在UI线程的中调用execute方法后执行此方法
	@Override
	protected void onPreExecute() {
		// TODO Auto-generated method stub
		super.onPreExecute();
		operate = new LongTimeOperate();
		textView.setText("任务开始啦");
	}

	//在执行任务的过程中更新显示数据,UI线程的publishProgress执行之后调用此方法
	@Override
	protected void onProgressUpdate(Integer... values) {
		// TODO Auto-generated method stub
		super.onProgressUpdate(values);
		int value = values[0];
		progressBar.setProgress(value+1);
	}

}
(4)MainActivity
public class MainActivity extends Activity implements OnClickListener {

	private Button showBtn = null;
	private Button cancelBtn = null;
	private Button hideBtn = null;

	private ProgressBar progressBar = null;
	private TextView textView = null;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		findViews();
		showBtn.setOnClickListener(this);
		hideBtn.setOnClickListener(this);
	}

	private void findViews() {
		showBtn = (Button) findViewById(R.id.showBtn);
		hideBtn = (Button) findViewById(R.id.hideBtn);

		progressBar = (ProgressBar) findViewById(R.id.progressBar);
		textView = (TextView) findViewById(R.id.textView);
	}

	@Override
	public void onClick(View view) {
		// TODO Auto-generated method stub
		switch (view.getId()) {
		case R.id.showBtn:
			textView.setVisibility(View.VISIBLE);
			progressBar.setVisibility(View.VISIBLE);
			MyAsyncTask myAsyncTask = new MyAsyncTask(progressBar,textView);
			myAsyncTask.execute(10);
			break;
		case R.id.hideBtn:
			textView.setVisibility(View.INVISIBLE);
			progressBar.setVisibility(View.INVISIBLE);
			break;

		}
	}

}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值