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系統常規構架就可以輕鬆入門谷歌移動平臺。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章