AsyncTask实例代码演示Android异步任务
原文地址 http://bbs.isgphone.com/viewthread.php?tid=5455 请支持原创 上次我们讲到了Android提供了一个较线程更简单的处理多任务的方法AsyncTask异步任务类,相对于线程来说AsyncTask对于简单的任务处理更安全,其内部的实现方法使用了Android的Handler机制,对于常见的文件下载可以使用AsyncTask类来处理,在Browser浏览器中就是用了该类下载Web服务器URL的Favicon图标。 首先Android123以简单的下载例子演示该类的大致结构,如下 privateclassDownloadFilesTaskextendsAsyncTask{ protectedLongdoInBackground(URL...urls){ intcount=urls.length; longtotalSize=0; for(inti=0;i<count;i++){ totalSize+=Downloader.downloadFile(urls[i]); publishProgress((int)((i/(float)count)100)); } returntotalSize; } protectedvoidonProgressUpdate(Integer...progress){ setProgressPercent(progress[0]); } protectedvoidonPostExecute(Longresult){ showDialog("Downloaded"+result+"bytes"); } } 最终我们执行 DownloadFilesTask().execute(url1, url2, url3); 即可。 在Android浏览器中下载Favicon图标的实现如下: classDownloadTouchIconextendsAsyncTask{ privatefinalContentResolvermContentResolver; privatefinalCursormCursor; privatefinalStringmOriginalUrl; privatefinalStringmUrl; privatefinalStringmUserAgent; /*package*/BrowserActivitymActivity; publicDownloadTouchIcon(BrowserActivityactivity,ContentResolvercr, Cursorc,WebViewview){//构造方法 mActivity=activity; mContentResolver=cr; mCursor=c; mOriginalUrl=view.getOriginalUrl(); mUrl=view.getUrl(); mUserAgent=view.getSettings().getUserAgentString(); } publicDownloadTouchIcon(ContentResolvercr,Cursorc,Stringurl){//实现本类的构造 mActivity=null; mContentResolver=cr; mCursor=c; mOriginalUrl=null; mUrl=url; mUserAgent=null; } @Override publicBitmapdoInBackground(String...values){//返回Bitmap类型 Stringurl=values[0]; AndroidHttpClientclient=AndroidHttpClient.newInstance(mUserAgent); HttpGetrequest=newHttpGet(url); HttpClientParams.setRedirecting(client.getParams(),true);//处理302等重定向问题 try{ HttpResponseresponse=client.execute(request); if(response.getStatusLine().getStatusCode()==200){//如果OK HttpEntityentity=response.getEntity(); if(entity!=null){ InputStreamcontent=entity.getContent();//将图标保存到InputStream中,因为是二进制内容 if(content!=null){ Bitmapicon=BitmapFactory.decodeStream(//从流中取出Bitmap,这里使用了BitmapFactory类的静态方法decodeStream content,null,null); returnicon; } } } }catch(IllegalArgumentExceptionex){ request.abort(); }catch(IOExceptionex){ request.abort(); }finally{ client.close(); } returnnull; } @Override protectedvoidonCancelled(){ if(mCursor!=null){ mCursor.close(); } } @Override publicvoidonPostExecute(Bitmapicon){ if(mActivity!=null){ mActivity.mTouchIconLoader=null; } if(icon==null||mCursor==null||isCancelled()){ return; } 最终图标要保存到浏览器的内部数据库中,系统程序均保存为SQLite格式,Browser也不例外,因为图片是二进制的所以使用字节数组存储数据库的BLOB类型 finalByteArrayOutputStreamos=newByteArrayOutputStream(); icon.compress(Bitmap.CompressFormat.PNG,100,os);//将Bitmap压缩成PNG编码,质量为100%存储 ContentValuesvalues=newContentValues();//构造SQLite的Content对象,这里也可以使用rawsql代替 values.put(Browser.BookmarkColumns.TOUCH_ICON,os.toByteArray());//写入数据库的Browser.BookmarkColumns.TOUCH_ICON字段 if(mCursor.moveToFirst()){ do{ mContentResolver.update(ContentUris.withAppendedId(Browser.BOOKMARKS_URI,mCursor.getInt(0)),values,null,null); }while(mCursor.moveToNext()); } mCursor.close(); } } 本次Android开发网通过两个AsyncTask类演示了多种类型的任务构造,这里大家注意返回类型,本节演示了Android平台上Content Provider、AsyncTask、Bitmap、HTTP以及Stream的相关操作,大家如何想很快提高开发水平其实只要理解Google如何去实现Android系统常规构架就可以轻松入门谷歌移动平台。 本文转自 kome2000 51CTO博客,原文链接:http://blog.51cto.com/kome2000/578720