为什么要异步任务
Android单线程模型
耗时操作放在非主线程中执行
AsyncTask 在子线程中更新UI,封装、简化异步操作。
AsyncTask基本结构:
参数:
AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承,继承AsyncTask需要指定三个泛型参数
Params:启动任务时输入参数的类型。
Progress:后台任务执行中返回进度值的类型。
Result:后台执行任务完成后返回结果的类型。
构建AsyncTask子类的回调方法:
dolnBackGround:必须重写,异步执行后台线程将要完成的任务。
onPreExecute:执行后台耗时操作前被调用,通常用户完成一些初始化操作
onPostExecute:当dolnBackground完成后,系统会自动掉用 onPostExecute()方法,并将doInBackground()方法返回的值传给该方法。
onProgressUpdate:在doInBackground()方法中调用publishProgrogress()方法。
使用网络获得一张PNG图片
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. activity_main);
//开启asyncTask的异步操作
new MyasyncTask().execute("http://stareblankly/az.png" );
}
/**
* Params:URL类型
* Progress : 进度值类型
* Result : 返回值类型
* @author az
*
*/
class MyasyncTask extends AsyncTask<String, integer, Bitmap>{
/**
* 最开始调用
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
}
/**
* onPreExecute完成后调用 并返回bitmap
*/
@Override
protected Bitmap doInBackground(String... params) {
String url=params[0]; //取出URL
Bitmap bitmap= null;
URLConnection Connection;
InputStream is;
try {
//访问网络的耗时操作
Connection= new URL(url).openConnection();
is=Connection.getInputStream();
BufferedInputStream bis= new BufferedInputStream(is);
//通过decodeStream方法解析输入流
bitmap=BitmapFactory. decodeStream(bis);
is.close();
bis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//将bitmap作为返回值
return bitmap;
}
/**
* 最后调用 并得到doInBackground返回的bitmap
*/
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
//
}
}
}