1. 为什么要有异步任务?
① 如果在子线程操作一些耗时的操作容易造成卡顿
② android规定主线程中不可以做http链接操作
2.为什么会有AsyncTask
① 子线程中更新UI
② 封装,简化异步操作
3.构建AsyncTask子类的参数
AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承,有三个参数
Params :启动任务时输入参数的类型
Progress:后台任务执行中返回进度值的类型
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,所以你就不必要直接用这两个低层类了,但他的目的也是代码复用,他的实现跟我们上面写的类也差不多。主要有这几点不同:一、AsyncTask使用了线程池而不是单个线程去执行后台任务,该线程池是整个进程共用的,是因为他的线程池对象是一个静态成员变量,这一点很多人搞错,误以为AsyncTask越多创建的线程越多,这不是绝对正确的,因为线程池会根据负载动态调整的,而且有最大值和空闲超时,AsyncTask的配置是最小5,最大128,空闲超时1秒,当然你也可以配置成线程数根据任务数线程递增;二、AsyncTask的输入和输出参数使用了泛型;三、AsyncTask支持中断当前任务。