Android使用AsyncTask 有如下好处: 1. 线程的开销较大,如果每个任务都要创建一个线程,那么应用程序的效率要低很多;
2. 线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有很多个请求发送,那么就会启动非常多的线程,系统将不堪重负;
3. 另外,在新线程中更新UI还必须要引入handler,这让代码看上去非常臃肿; 为了解决这一问题,Android在1.5版本引入了AsyncTask. AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦。阅读AsyncTask的源码可知,AsyncTask是使用java.util.concurrent 框架来管理线程以及任务的执行的,concurrent框架是一个非常成熟,高效的框架,经过了严格的测试。这说明AsyncTask的设计很好的解决了匿名线程存在的问题。
AsyncTask定义了三种泛型类型 Params,Progress和Result.
  1. Params启动任务执行的输入参数,比如HTTP请求的URL;
  2. Progress后台任务执行的百分比;
  3. Result后台执行任务最终返回的结果,比如String;
子类必须实现抽象方法doInBackground(Params… p) ,在此方法中实现任务的执行工作,比如连接网络获取数据等。通常还应该实现onPostExecute(Result r)方法,因为应用程序关心的结果在此方法中返回。需要注意的是AsyncTask一定要在主线程中创建实例。
AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,需要注意的是这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。在任务的执行过程中,这些方法被自动调用,运行过程, onPreExecute()当任务执行之前开始调用此方法,可以在这里显示进度对话框。 doInBackground(Params…)此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。 onProgressUpdate(Progress…)此方法在主线程执行,用于显示任务执行的进度。 onPostExecute(Result)此方法在主线程执行,任务执行的结果作为此方法的参数返回。
class GetImageTask extends AsyncTask<String, Void, Bitmap>{        InputStream is = null;                @Override        protected Bitmap doInBackground(String... params) {            // TODO Auto-generated method stub            URL myFileUrl = null;            Bitmap bitmap = null;            InputStream is = null;          HttpURLConnection conn = null;          try {              myFileUrl = new URL(params[0]);          } catch (MalformedURLException e) {              e.printStackTrace();          }         try {              conn = (HttpURLConnection)myFileUrl                      .openConnection();              conn.setDoInput(true);              conn.connect();              is =conn.getInputStream();              bitmap =BitmapFactory.decodeStream(is);              is.close();          } catch (IOException e) {              e.printStackTrace();          }finally{                                 try {                      if(is != null){                      is.close();                      }                      if( conn != null){                          conn.disconnect();                      }                  } catch (IOException e) {                      // TODO Auto-generated catch block                      e.printStackTrace();                  }                         }         return bitmap;      }     @Override      protected void onCancelled() {         // TODO Auto-generated method stub          super.onCancelled();     }     @Override      protected void onPostExecute(Bitmap result) {          // TODO Auto-generated method stub                mImageAndTextView.setImage(result);                   mImageAndTextView.postInvalidate(0, 0 , mScreenWidth ,mImageHeight + 30);       //只更新稍比图片大一些的区域           super.onPostExecute(result);      }       }  


更多相关文章

  1. Android获取SD卡路径/内存的几种方法
  2. Android 进程和线程模型 .
  3. 【Android增量升级系列_02】 浅谈Android增量更新服务端的实现方
  4. Android中Handler异步线程
  5. WebView之js调用Android类的方法传递数据 - 依凡王子
  6. 进程和线程模型(android)

随机推荐

  1. Android大图片裁剪终极解决方案(中:从相册
  2. Django服务器与App(Android)客户端的简单实
  3. Android(安卓)用户界面(User Interface)概
  4. Android解析WindowManagerService(二)WMS的
  5. Android(安卓)Handler Looper
  6. android之模拟手机助手下载
  7. android 解决getNetworkInfo过时
  8. Android(安卓)4.0 Launcher2源码分析——
  9. Android(安卓)JNI 使用的数据结构JNINati
  10. 摩托罗拉公司在开发Android应用商店 – S