原文地址

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(安卓)GSM驱动模块(rild)详细分析(一)基本架构及初始化
  2. Android菜单详解(三)——SubMenu和IconMenu
  3. Android实现图标水印
  4. Android(安卓)AsyncTask 异步任务取消
  5. Android聊天软件开发(基于网易云IM即时通讯)——添加好友(三)
  6. Android(安卓)打开手电筒
  7. android之AsncTask异步任务使用
  8. android 状态栏显示运行图标
  9. android中的定时任务AlarmManager

随机推荐

  1. Android官方网站!
  2. android 6.0系统 make otapackage 错误
  3. Android绘制进阶之五:位图的处理
  4. Android RecyclerView(1)——范例篇
  5. android 仿微信5版本实现滑动导航条
  6. Android中自定义通用Json解释器
  7. Intent在Android中的几种用法 .
  8. Android Gson 解析泛型报错
  9. Android 6.0 关于WiFi的改变
  10. Android打Jar包注意事项