原文地址

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

请支持原创

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

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

        
  1. privateclassDownloadFilesTaskextendsAsyncTask{
  2.   protectedLongdoInBackground(URL...urls){
  3.   intcount=urls.length;
  4.   longtotalSize=0;
  5.   for(inti=0;i<count;i++){
  6.   totalSize+=Downloader.downloadFile(urls[i]);
  7.   publishProgress((int)((i/(float)count)100));
  8.   }
  9.   returntotalSize;
  10.   }
  11.   protectedvoidonProgressUpdate(Integer...progress){
  12.   setProgressPercent(progress[0]);
  13.   }
  14.   protectedvoidonPostExecute(Longresult){
  15.   showDialog("Downloaded"+result+"bytes");
  16.   }
  17.   }

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

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

        
  1. classDownloadTouchIconextendsAsyncTask{
  2.   privatefinalContentResolvermContentResolver;
  3.   privatefinalCursormCursor;
  4.   privatefinalStringmOriginalUrl;
  5.   privatefinalStringmUrl;
  6.   privatefinalStringmUserAgent;
  7.   /*package*/BrowserActivitymActivity;
  8.   publicDownloadTouchIcon(BrowserActivityactivity,ContentResolvercr,
  9.   Cursorc,WebViewview){//构造方法
  10.   mActivity=activity;
  11.   mContentResolver=cr;
  12.   mCursor=c;
  13.   mOriginalUrl=view.getOriginalUrl();
  14.   mUrl=view.getUrl();
  15.   mUserAgent=view.getSettings().getUserAgentString();
  16.   }
  17.   publicDownloadTouchIcon(ContentResolvercr,Cursorc,Stringurl){//实现本类的构造
  18.   mActivity=null;
  19.   mContentResolver=cr;
  20.   mCursor=c;
  21.   mOriginalUrl=null;
  22.   mUrl=url;
  23.   mUserAgent=null;
  24.   }
  25.   @Override
  26.   publicBitmapdoInBackground(String...values){//返回Bitmap类型
  27.   Stringurl=values[0];
  28.   AndroidHttpClientclient=AndroidHttpClient.newInstance(mUserAgent);
  29.   HttpGetrequest=newHttpGet(url);
  30.   HttpClientParams.setRedirecting(client.getParams(),true);//处理302等重定向问题
  31.   try{
  32.   HttpResponseresponse=client.execute(request);
  33.   if(response.getStatusLine().getStatusCode()==200){//如果OK
  34.   HttpEntityentity=response.getEntity();
  35.   if(entity!=null){
  36.   InputStreamcontent=entity.getContent();//将图标保存到InputStream中,因为是二进制内容
  37.   if(content!=null){
  38.   Bitmapicon=BitmapFactory.decodeStream(//从流中取出Bitmap,这里使用了BitmapFactory类的静态方法decodeStream
  39.   content,null,null);
  40.   returnicon;
  41.   }
  42.   }
  43.   }
  44.   }catch(IllegalArgumentExceptionex){
  45.   request.abort();
  46.   }catch(IOExceptionex){
  47.   request.abort();
  48.   }finally{
  49.   client.close();
  50.   }
  51.   returnnull;
  52.   }
  53.   @Override
  54.   protectedvoidonCancelled(){
  55.   if(mCursor!=null){
  56.   mCursor.close();
  57.   }
  58.   }
  59.   @Override
  60.   publicvoidonPostExecute(Bitmapicon){
  61.   if(mActivity!=null){
  62.   mActivity.mTouchIconLoader=null;
  63.   }
  64.   if(icon==null||mCursor==null||isCancelled()){
  65.   return;
  66.   }

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

        
  1. finalByteArrayOutputStreamos=newByteArrayOutputStream();
  2.   icon.compress(Bitmap.CompressFormat.PNG,100,os);//将Bitmap压缩成PNG编码,质量为100%存储
  3.   ContentValuesvalues=newContentValues();//构造SQLite的Content对象,这里也可以使用rawsql代替
  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)),values,null,null);
  8.   }while(mCursor.moveToNext());
  9.   }
  10.   mCursor.close();
  11.   }
  12.   }

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

更多相关文章

  1. android工程建立到最后一步提示unsupported template dependency
  2. 自己封装的Android sqlite-helper.jar包使用方法
  3. Android四种点击事件方法
  4. Android使用Parcelable传递对象方法及注意事项
  5. Android源码获取方法
  6. Android线程优先级设置方法
  7. 【Android】设置tabhost位于底部的三种方法
  8. Mars Android视频学习笔记——01_16_SQLite使用方法
  9. Android 总结:进阶之路(资源与方法)

随机推荐

  1. 手把手教你搞定权限管理,结合Spring Secur
  2. 开发中总结的dart相关的技巧
  3. Elasticsearch aggs 聚合
  4. 用户注册表练习
  5. 这才是你需要的C语言、C++学习路线!
  6. 数学相关函数在PHP中的应用简介
  7. 简单计算器
  8. PHP字符运算、类型转换和系统函数
  9. 简单计算器
  10. 为什么我们要面向接口编程?!