AsyncTask实例代码演示Android异步任务

原文地址

http://bbs.isgphone.com/viewthread.php?tid=5455

请支持原创

  1. 上次我们讲到了Android提供了一个较线程更简单的处理多任务的方法AsyncTask异步任务类,相对于线程来说AsyncTask对于简单的任务处理更安全,其内部的实现方法使用了Android的Handler机制,对于常见的文件下载可以使用AsyncTask类来处理,在Browser浏览器中就是用了该类下载Web服务器URL的Favicon图标。
  2.   首先Android123以简单的下载例子演示该类的大致结构,如下
  3.   private class DownloadFilesTask extends AsyncTask {
  4.   protected Long doInBackground(URL... urls) {
  5.   int count = urls.length;
  6.   long totalSize = 0;
  7.   for (int i = 0; i < count; i++) {
  8.   totalSize += Downloader.downloadFile(urls[i]);
  9.   publishProgress((int) ((i / (float) count)100));
  10.   }
  11.   return totalSize;
  12.   }
  13.   protected void onProgressUpdate(Integer... progress) {
  14.   setProgressPercent(progress[0]);
  15.   }
  16.   protected void onPostExecute(Long result) {
  17.   showDialog("Downloaded " + result + " bytes");
  18.   }
  19.   }
  20.   最终我们执行 DownloadFilesTask().execute(url1, url2, url3); 即可。
  21.   在Android浏览器中下载Favicon图标的实现如下:
  22.   class DownloadTouchIcon extends AsyncTask {
  23.   private final ContentResolver mContentResolver;
  24.   private final Cursor mCursor;
  25.   private final String mOriginalUrl;
  26.   private final String mUrl;
  27.   private final String mUserAgent;
  28.   /* package */ BrowserActivity mActivity;
  29.   public DownloadTouchIcon(BrowserActivity activity, ContentResolver cr,
  30.   Cursor c, WebView view) { //构造方法
  31.   mActivity = activity;
  32.   mContentResolver = cr;
  33.   mCursor = c;
  34.   mOriginalUrl = view.getOriginalUrl();
  35.   mUrl = view.getUrl();
  36.   mUserAgent = view.getSettings().getUserAgentString();
  37.   }
  38.   public DownloadTouchIcon(ContentResolver cr, Cursor c, String url) { //实现本类的构造
  39.   mActivity = null;
  40.   mContentResolver = cr;
  41.   mCursor = c;
  42.   mOriginalUrl = null;
  43.   mUrl = url;
  44.   mUserAgent = null;
  45.   }
  46.   @Override
  47.   public Bitmap doInBackground(String... values) { //返回Bitmap类型
  48.   String url = values[0];
  49.   AndroidHttpClient client = AndroidHttpClient.newInstance(mUserAgent);
  50.   HttpGet request = new HttpGet(url);
  51.   HttpClientParams.setRedirecting(client.getParams(), true); //处理302等重定向问题
  52.   try {
  53.   HttpResponse response = client.execute(request);
  54.   if (response.getStatusLine().getStatusCode() == 200) { //如果OK
  55.   HttpEntity entity = response.getEntity();
  56.   if (entity != null) {
  57.   InputStream content = entity.getContent(); //将图标保存到InputStream中,因为是二进制内容
  58.   if (content != null) {
  59.   Bitmap icon = BitmapFactory.decodeStream( //从流中取出Bitmap,这里使用了BitmapFactory类的静态方法decodeStream
  60.   content, null, null);
  61.   return icon;
  62.   }
  63.   }
  64.   }
  65.   } catch (IllegalArgumentException ex) {
  66.   request.abort();
  67.   } catch (IOException ex) {
  68.   request.abort();
  69.   } finally {
  70.   client.close();
  71.   }
  72.   return null;
  73.   }
  74.   @Override
  75.   protected void onCancelled() {
  76.   if (mCursor != null) {
  77.   mCursor.close();
  78.   }
  79.   }
  80.   @Override
  81.   public void onPostExecute(Bitmap icon) {
  82.   if (mActivity != null) {
  83.   mActivity.mTouchIconLoader = null;
  84.   }
  85.   if (icon == null || mCursor == null || isCancelled()) {
  86.   return;
  87.   }
  88.   最终图标要保存到浏览器的内部数据库中,系统程序均保存为SQLite格式,Browser也不例外,因为图片是二进制的所以使用字节数组存储数据库的BLOB类型
  89.   final ByteArrayOutputStream os = new ByteArrayOutputStream();
  90.   icon.compress(Bitmap.CompressFormat.PNG, 100, os); //将Bitmap压缩成PNG编码,质量为100%存储
  91.   ContentValues values = new ContentValues(); //构造SQLite的Content对象,这里也可以使用raw sql代替
  92.   values.put(Browser.BookmarkColumns.TOUCH_ICON,os.toByteArray()); //写入数据库的Browser.BookmarkColumns.TOUCH_ICON字段
  93.   if (mCursor.moveToFirst()) {
  94.   do {
  95.   mContentResolver.update(ContentUris.withAppendedId(Browser.BOOKMARKS_URI, mCursor.getInt(0)),values, null, null);
  96.   } while (mCursor.moveToNext());
  97.   }
  98.   mCursor.close();
  99.   }
  100.   }
  101.   本次Android开发网通过两个AsyncTask类演示了多种类型的任务构造,这里大家注意返回类型,本节演示了Android平台上Content Provider、AsyncTask、Bitmap、HTTP以及Stream的相关操作,大家如何想很快提高开发水平其实只要理解Google如何去实现Android系统常规构架就可以轻松入门谷歌移动平台。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值