首页 > 学院 > 开发设计 > 正文

AsyncTask简单使用

2019-11-06 09:49:03
字体:
来源:转载
供稿:网友
除了Handler,其实Android提供了另外一个类: AsyncTask, 也就是异步任务

1. 基本用法:

public class MainActivity extends Activity {	@Override	PRotected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);		// 执行异步任务		new MyAsyncTask().execute();	}	/**	 * 使用AsyncTask, 需要创建一个 AsyncTask 的子类, 注意泛型, 这里可以先传Void	 *	 */	private class MyAsyncTask extends AsyncTask<Void, Void, Void> {		// 执行异步任务之前调用		@Override		protected void onPreExecute() {			super.onPreExecute();			// 此方法在主线程中运行		}		// 在子线程中运行, 可以做耗时操作		@Override		protected Void doInBackground(Void... params) {			// 此方法在子线程中运行			return null;		}		// 异步任务执行完后调用		@Override		protected void onPostExecute(Void result) {			super.onPostExecute(result);			// 此方法在主线程中运行		}	}}2. 三个泛型的含义2.1. 首先我们把第一个泛型改成 String, 

private class MyAsyncTask extends AsyncTask<String, Void, Void>{...}此时 doInBackground 会报错, 第一个泛型其实是 doInBackground 方法的参数类型

@Overrideprotected Void doInBackground(String... params) {	// 此方法在子线程中运行	// 获取方法参数	System.out.println(params[0]);	return null;}那么这个参数的值是从哪里传过来呢? 是在执行异步任务的时候传入的:new MyAsyncTask().execute("http://www.baidu.com");

2.2. 把第二个泛型改为 Integer, private class MyAsyncTask extends AsyncTask<String, Integer, Void> {...}发现没有哪里报错, 这第二个泛型的用法如下:

protected Void doInBackground(String... params) {	// 此方法在子线程中运行	System.out.println(params[0]);	for (int i = 0; i < 10; i++) {		SystemClock.sleep(500);		// 更新进度, 第二个泛型其实是这个方法的参数类型		publishProgress(i);	}	return null;}// 当在 doInBackground 中调用 publishProgress 后, 这个方法会被调用// 这个方法也是在主线程中调用的, 用于更新进度, 参数类型是第二个泛型类型@Overrideprotected void onProgressUpdate(Integer... values) {	super.onProgressUpdate(values);	System.out.println(values[0]);}2.3. 把第三个泛型也改为 String, private class MyAsyncTask extends AsyncTask<String, Integer, String> {...}发现 doInBackground 和 onPostExecute 都报错了第三个泛型是 doInBackground 的返回值类型, 也是 onPostExecute 的参数类型用法如下:

@Overrideprotected ArrayList<String> doInBackground(String... params) {	// 此方法在子线程中运行	System.out.println(params[0]);	for (int i = 0; i < 10; i++) {		SystemClock.sleep(500);		// 此方法用于更新进度, 第二个泛型其实是这个方法的参数类型		publishProgress(i);	}	// 假设这个方法里从网络获取数据成功	return "成功";}// 方法参数就是 doInBackground 的返回值@Overrideprotected void onPostExecute(String result) {	super.onPostExecute(result);	// 此方法在主线程中运行	System.out.println(result);}  


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表