1. 为何要有异步任务? android
① 若是在子线程操做一些耗时的操做容易形成卡顿spring
② android规定主线程中不能够作http连接操做异步
2.为何会有AsyncTaskide
① 子线程中更新UI 源码分析
② 封装,简化异步操做url
3.构建AsyncTask子类的参数spa
AsyncTask<Params,Progress,Result>是一个抽象类,一般用于被继承,有三个参数.net
Params :启动任务时输入参数的类型线程
Progress:后台任务执行中返回进度值的类型code
Result:后台执行任务完成后返回结果的类型
4.须要重写的方法
① doInBackground :须要重写,异步执行后台线程将要完成的任务
② onPreExecute:执行后台耗时操做前被调用,一般用户完成一些初始化操做
③onPostExecute:当doInBackground()完成后,系统会自动调用onPostExecute(),并将doInBackground 方法返回的值传给该方法
④onProgressUpdate:在doInBackground()方法中调用publishProgress()方法,更新任务的执行进度后, 就会触发该方法
5.使用时的注意事项
① 必须在UI线程中建立AsyncTask实例和调用execute方法
② 重写的四个方法是系统自动调用的,不该该手动调用
③ 每一个AsyncTask只能被执行一次,多吃哦调用将会引起异常
AsyncTask请求图片
private class MyAsyncTask extends AsyncTask<String, Integer, Bitmap> { private Bitmap bitmap; @Override protected Bitmap doInBackground(String... params) { //获取传递进来的参数 String url = params[0]; try { URL url1 = new URL(url); URLConnection urlConnection = url1.openConnection(); InputStream is = urlConnection.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); //经过decodeStream解析输入流 bitmap = BitmapFactory.decodeStream(bis); is.close(); bis.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return bitmap; } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); img.setImageBitmap(bitmap); } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); } }
AsyncTask加载进度条
private class MyAsyncTask2 extends AsyncTask<Void, Integer, Void> { @Override protected Void doInBackground(Void... params) { for (int i = 0; i < 100; i++) { if(isCancelled()){ break; } publishProgress(i); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } return null; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); if(isCancelled()){ return; } progressbar.setProgress(values[0]); } }
源码分析参考地址
http://blog.csdn.net/iispring/article/details/50670388
深刻理解AsyncTask
This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.
意思是这个类使得:不使用Thread和Handler,就能够在后台执行操做而后在发布结果到UI线程。其实他内部的实现就是封装了Thread和Handler,因此你就没必要要直接用这两个低层类了,但他的目的也是代码复用,他的实现跟咱们上面写的类也差很少。主要有这几点不一样:1、AsyncTask使用了线程池而不是单个线程去执行后台任务,该线程池是整个进程共用的,是由于他的线程池对象是一个静态成员变量,这一点不少人搞错,误觉得AsyncTask越多建立的线程越多,这不是绝对正确的,由于线程池会根据负载动态调整的,并且有最大值和空闲超时,AsyncTask的配置是最小5,最大128,空闲超时1秒,固然你也能够配置成线程数根据任务数线程递增;2、AsyncTask的输入和输出参数使用了泛型;3、AsyncTask支持中断当前任务。