Android 1.5提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单。相对来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可实现。
关于AsuncTask的几种方法:
一个异步任务的执行一般包括以下几个步骤:
1.
执行(Params ... params)
,执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。
2.
onPreExecute()
,在execute(Params ... params)被调用后立即执行,一般用来执行后台任务前对UI做一些标记。
3.
doInBackground(参数... PARAMS)
,在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(进展..值)来更新进度信息。
4.
onProgressUpdate(Progress... values)
,在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。
5.
onPostExecute(Result result)
,当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。
//下面是代码 简单操作
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AsyncTask<Void,Void,Bitmap> asyncTask=new AsyncTask<Void, Void, Bitmap>() { //添加在开始之前的准备工作 @Override protected void onPreExecute() { //在加载图片之前 进行ProgressBar的设置 //图片加载完成之前ProgressBar可见 pb.setVisibility(View.VISIBLE); super.onPreExecute(); } //相当于子线程 在子线程中获取数据 @Override protected Bitmap doInBackground(Void... params) { try { URL url=new URL("http://p2.so.qhimgs1.com/sdr/539_768_/t01dd2d9905a6f3ec9e.jpg"); HttpURLConnection connection=(HttpURLConnection)url.openConnection(); //设置请求方式 connection.setRequestMethod("GET"); connection.setConnectTimeout(1024*8); connection.setReadTimeout(1024*8); int responseCode = connection.getResponseCode(); if (responseCode==200){ InputStream is=connection.getInputStream(); //获取图片的方法 Bitmap bitmap = BitmapFactory.decodeStream(is); return bitmap; } } catch (Exception e) { e.printStackTrace(); } return null; } //相当于主线程 进行UI更新操作 @Override protected void onPostExecute(Bitmap bitmap) { image.setImageBitmap(bitmap); //图片加载完成后 隐藏ProgressBar pb.setVisibility(View.GONE); super.onPostExecute(bitmap); } }; asyncTask.execute();//设置串行下载(一个下载完了才会下载下一个 不会同时下载多个) //asyncTask.executeOnExecutor();并行下载 可以多个任务一起下载 (不好) } }); } }今天大概又系统的总结了下AsyncTask,
public class MainActivity extends AppCompatActivity {
private ProgressDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new MyAsyncTask().execute("");//这里的参数就是要请求的网址
}
// 第一个泛型就是 doInBackground 方法的参数类型, 也就是execute传入的参数类型
// 第二个泛型是 publishProgress(在doInBackground 里调用) 方法的参数类型, 也是onProgressUpdate方法的参数类型
// 第二个泛型是 doInBackground 的返回值类型, 也是 onPostExecute 的参数类型
private class MyAsyncTask extends AsyncTask<String,Integer,String>{
//一
@Override//运行在主线程,执行在doInBackground之前 也就是在子线程之前运行(只要运行在网络求情之前的操作都可以写在这里面)
protected void onPreExecute() {
//进度条 /进度条初始化/
super.onPreExecute();
}
//二
@Override//这里相当于子线程 可以获取网络数据 通过params[0]得到网址
protected String doInBackground(String... params) {
String name = Thread.currentThread().getName();
Log.d("PY","doInBackground接受的参数"+params[0]+"所在线程"+name);
//这里做网络请求的操作
//发布进度条///加载进度条/
for (int i = 0; i <10 ; i++) {
publishProgress(i);//调用这个方法实际运行的方法是onProgressUpdate这个方法
}
return null;
//这里返回 下面的onPostExecute接受 相当于异步请求
}
@Override//在这里更新设置进度条
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
@Override//这里相当于在主线程 运行在doInBackground之后
protected void onPostExecute(String s) {// S相当于doInBackground返回的数据
//拿到处理后的数据 进行UI更新
//结束进度条
super.onPostExecute(s);
}
}
}
这相当于一个AsyncTask的大体框架,里面可以根据注释放入一些代码,来实现一些功能;