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

简介:

原文地址

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

请支持原创

上次我们讲到了Android提供了一个较线程更简单的处理多任务的方法AsyncTask异步任务类,相对于线程来说AsyncTask对于简单的任务处理更安全,其内部的实现方法使用了Android的Handler机制,对于常见的文件下载可以使用AsyncTask类来处理,在Browser浏览器中就是用了该类下载Web服务器URL的Favicon图标。

首先Android123以简单的下载例子演示该类的大致结构,如下

 
  1. private class DownloadFilesTask extends AsyncTask {   
  2.   protected Long doInBackground(URL... urls) {   
  3.   int count = urls.length;   
  4.   long totalSize = 0;   
  5.   for (int i = 0; i < count; i++) {   
  6.   totalSize += Downloader.downloadFile(urls[i]);   
  7.   publishProgress((int) ((i / (floatcount)100));   
  8.   }   
  9.   return totalSize;   
  10.   }   
  11.   protected void onProgressUpdate(Integer... progress) {   
  12.   setProgressPercent(progress[0]);   
  13.   }   
  14.   protected void onPostExecute(Long result) {   
  15.   showDialog("Downloaded " + result + " bytes");   
  16.   }   
  17.   }  

最终我们执行 DownloadFilesTask().execute(url1, url2, url3); 即可。

在Android浏览器中下载Favicon图标的实现如下:

 
  1. class DownloadTouchIcon extends AsyncTask {   
  2.   private final ContentResolver mContentResolver;   
  3.   private final Cursor mCursor;   
  4.   private final String mOriginalUrl;   
  5.   private final String mUrl;   
  6.   private final String mUserAgent;   
  7.   /* package */ BrowserActivity mActivity;   
  8.   public DownloadTouchIcon(BrowserActivity activity, ContentResolver cr,   
  9.   Cursor c, WebView view) { //构造方法   
  10.   mActivity = activity;   
  11.   mContentResolver = cr;   
  12.   mCursor = c;   
  13.   mOriginalUrl = view.getOriginalUrl();   
  14.   mUrl = view.getUrl();   
  15.   mUserAgent = view.getSettings().getUserAgentString();   
  16.   }   
  17.   public DownloadTouchIcon(ContentResolver cr, Cursor c, String url) { //实现本类的构造   
  18.   mActivity = null;   
  19.   mContentResolver = cr;   
  20.   mCursor = c;   
  21.   mOriginalUrl = null;   
  22.   mUrl = url;   
  23.   mUserAgent = null;   
  24.   }   
  25.   @Override   
  26.   public Bitmap doInBackground(String... values) { //返回Bitmap类型   
  27.   String url = values[0];   
  28.   AndroidHttpClient client = AndroidHttpClient.newInstance(mUserAgent);   
  29.   HttpGet request = new HttpGet(url);   
  30.   HttpClientParams.setRedirecting(client.getParams(), true); //处理302等重定向问题   
  31.   try {   
  32.   HttpResponse response = client.execute(request);   
  33.   if (response.getStatusLine().getStatusCode() == 200) { //如果OK   
  34.   HttpEntity entity = response.getEntity();   
  35.   if (entity != null) {   
  36.   InputStream content = entity.getContent(); //将图标保存到InputStream中,因为是二进制内容   
  37.   if (content != null) {   
  38.   Bitmap icon = BitmapFactory.decodeStream( //从流中取出Bitmap,这里使用了BitmapFactory类的静态方法decodeStream   
  39.   content, nullnull);   
  40.   return icon;   
  41.   }   
  42.   }   
  43.   }   
  44.   } catch (IllegalArgumentException ex) {   
  45.   request.abort();   
  46.   } catch (IOException ex) {   
  47.   request.abort();   
  48.   } finally {   
  49.   client.close();   
  50.   }   
  51.   return null;   
  52.   }   
  53.   @Override   
  54.   protected void onCancelled() {   
  55.   if (mCursor != null) {   
  56.   mCursor.close();   
  57.   }   
  58.   }   
  59.   @Override   
  60.   public void onPostExecute(Bitmap icon) {   
  61.   if (mActivity != null) {   
  62.   mActivity.mTouchIconLoader = null;   
  63.   }   
  64.   if (icon == null || mCursor == null || isCancelled()) {   
  65.   return;   
  66.   }  

最终图标要保存到浏览器的内部数据库中,系统程序均保存为SQLite格式,Browser也不例外,因为图片是二进制的所以使用字节数组存储数据库的BLOB类型

 
  1. final ByteArrayOutputStream os = new ByteArrayOutputStream();   
  2.   icon.compress(Bitmap.CompressFormat.PNG, 100, os); //将Bitmap压缩成PNG编码,质量为100%存储   
  3.   ContentValues values = new ContentValues(); //构造SQLite的Content对象,这里也可以使用raw sql代替   
  4.   values.put(Browser.BookmarkColumns.TOUCH_ICON,os.toByteArray()); //写入数据库的Browser.BookmarkColumns.TOUCH_ICON字段   
  5.   if (mCursor.moveToFirst()) {   
  6.   do {   
  7.   mContentResolver.update(ContentUris.withAppendedId(Browser.BOOKMARKS_URI, mCursor.getInt(0)),valuesnullnull);   
  8.   } while (mCursor.moveToNext());   
  9.   }   
  10.   mCursor.close();   
  11.   }   
  12.   }  

本次Android开发网通过两个AsyncTask类演示了多种类型的任务构造,这里大家注意返回类型,本节演示了Android平台上Content Provider、AsyncTask、Bitmap、HTTP以及Stream的相关操作,大家如何想很快提高开发水平其实只要理解Google如何去实现Android系统常规构架就可以轻松入门谷歌移动平台。




本文转自 kome2000 51CTO博客,原文链接:http://blog.51cto.com/kome2000/578720

相关文章
|
1月前
|
Linux Android开发 iOS开发
深入探索Android与iOS的多任务处理机制
在移动操作系统领域,Android和iOS各有千秋,尤其在多任务处理上展现出不同的设计理念和技术实现。本文将深入剖析两大平台在后台管理、资源分配及用户体验方面的策略差异,揭示它们如何平衡性能与电池寿命,为用户带来流畅而高效的操作体验。通过对比分析,我们不仅能够更好地理解各自系统的工作机制,还能为开发者优化应用提供参考。
|
1月前
|
算法 Linux 调度
深入探索安卓系统的多任务处理机制
【10月更文挑战第21天】 本文旨在为读者提供一个关于Android系统多任务处理机制的全面解析。我们将从Android操作系统的核心架构出发,探讨其如何管理多个应用程序的同时运行,包括进程调度、内存管理和电量优化等方面。通过深入分析,本文揭示了Android在处理多任务时所面临的挑战以及它如何通过创新的解决方案来提高用户体验和设备性能。
46 1
|
2月前
|
Android开发
Android gradle task任务检查各个module之间资源文件冲突.md
Android gradle task任务检查各个module之间资源文件冲突.md
Android gradle task任务检查各个module之间资源文件冲突.md
|
2月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
35 1
|
2月前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异:从代码到用户体验
【10月更文挑战第5天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。它们在技术架构、开发环境及用户体验上有着根本的不同。本文通过比较这两种平台的开发过程,揭示背后的设计理念和技术选择如何影响最终产品。我们将深入探讨各自平台的代码示例,理解开发者面临的挑战,以及这些差异如何塑造用户的日常体验。
|
3月前
|
存储 Java Android开发
🔥Android开发大神揭秘:从菜鸟到高手,你的代码为何总是慢人一步?💻
在Android开发中,每位开发者都渴望应用响应迅速、体验流畅。然而,代码执行缓慢却是常见问题。本文将跟随一位大神的脚步,剖析三大典型案例:主线程阻塞导致卡顿、内存泄漏引发性能下降及不合理布局引起的渲染问题,并提供优化方案。通过学习这些技巧,你将能够显著提升应用性能,从新手蜕变为高手。
38 2
|
2月前
|
Android开发 Kotlin
Android面试题之Kotlin中如何实现串行和并行任务?
本文介绍了 Kotlin 中 `async` 和 `await` 在并发编程中的应用,包括并行与串行任务的处理方法。并通过示例代码展示了如何启动并收集异步任务的结果。
35 0
|
3月前
|
Android开发 开发者 Kotlin
告别AsyncTask:一招教你用Kotlin协程重构Android应用,流畅度飙升的秘密武器
【9月更文挑战第13天】随着Android应用复杂度的增加,有效管理异步任务成为关键。Kotlin协程提供了一种优雅的并发操作处理方式,使异步编程更简单直观。本文通过具体示例介绍如何使用Kotlin协程优化Android应用性能,包括网络数据加载和UI更新。首先需在`build.gradle`中添加coroutines依赖。接着,通过定义挂起函数执行网络请求,并在`ViewModel`中使用`viewModelScope`启动协程,结合`Dispatchers.Main`更新UI,避免内存泄漏。使用协程不仅简化代码,还提升了程序健壮性。
113 1
|
4月前
|
JSON JavaScript 前端开发
Android调用Vue中的JavaScript代码
Android调用Vue中的JavaScript代码
58 3
|
4月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
很多文章都介绍了FTPClient如何连接ftp服务器,但却很少有人说如何连接一台开了SSL认证的ftp服务器,现在代码来了。
119 2