AsyncTask实例代码演示Android异步任务
16lz
2021-01-23
原文地址
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系统常规构架就可以轻松入门谷歌移动平台。
更多相关文章
- android工程建立到最后一步提示unsupported template dependency
- 自己封装的Android sqlite-helper.jar包使用方法
- Android四种点击事件方法
- Android使用Parcelable传递对象方法及注意事项
- Android源码获取方法
- Android线程优先级设置方法
- 【Android】设置tabhost位于底部的三种方法
- Mars Android视频学习笔记——01_16_SQLite使用方法
- Android 总结:进阶之路(资源与方法)