简介AsyncTask

AsyncTask作为android提供的轻量级异步类,实现异步操作。同Thread+Handler组合实现异步来讲,它的实现方式显得更加简洁一些。

完整的大纲视图:


通过cancel(),getStatus()等方法,发现我们对线程是可控的。


使用:

我们直接继承AsyncTask 就可以了。

class TestAsyncTask extends AsyncTask<Params, Progress, Result>

3个泛型参数类型:

params:excute()中输入的枚举参数类型,会在doInBackground()中作为输入参数数组类型。

Progress:doInBackground()中返回给onProgressUpdate()的输入类型。

Result:doInbackground()的返回类型,也是onpostExcute()的输入类型。


方法,执行顺序从上至下依次进行:



首先我们会在ui线程中,创建该任务,然后excute()方法启动任务。

excute(Params...params):传递枚举数据给doInBackground(params)作为输入参数。

onPreExcute():在excute()执行后执行,一般作为在子线程运行前的对ui的标记。

doInBackground(Params...params):在onPreExcute()执行后执行,在子线程中执行,用于网络操作等比较费时的操作,不能操作ui线程组件。

onProgressUpdate(Progress...values):在doInBackground()中执行publishProgress(),将消息更新到ui中。

onPostExcute(Result result):当doInBackground()执行完后执行,接受其返回的数据。


实例:

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		TestAsyncTask task = new TestAsyncTask();
		// doInBackground :传递枚举数据
		task.execute("p1", "p2", "p3");
	}

	private class TestAsyncTask extends AsyncTask<String, String, String> {

		@Override
		protected void onPreExecute() {
			// TODO Auto-generated method stub
			super.onPreExecute();
			Log.d("onPreExecute", "in onPreExecute");
		}

		/**
		 * params :数组。来自excute 传递的枚举数据.
		 */
		@Override
		protected String doInBackground(String... params) {
			// TODO Auto-generated method stub
			// 遍历传递的数据
			for (int i = 0; i < params.length; i++) {
				Log.d("doInBackground", params[i]);
			}
			// 向 onPostExecute()传递参数
			publishProgress("in publish");
			// 向onPostExecute()传递参数
			return "in result";
		}

		@Override
		protected void onProgressUpdate(String... values) {
			// TODO Auto-generated method stub
			Log.d("onProgressUpdate", values[0]);
		}

		@Override
		protected void onPostExecute(String result) {
			// TODO Auto-generated method stub
			Log.d("onPostExecute", result);
		}

	}
}

运行效果:



注意:

1.异步任务的实例必须在ui线程中创建和执行。

2.不能手动的调用内部的这几个方法。doInBackground()方法中不能对ui组件进行操作。

3.一个任务实例只能执行一次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值