亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 25673 | 回復(fù): 7
打印 上一主題 下一主題

Android底下多線程下載遠(yuǎn)程圖片 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2010-07-23 11:28 |只看該作者 |倒序?yàn)g覽
本帖最后由 linux初學(xué)三月 于 2010-07-23 11:41 編輯

在某些時(shí)候我們需要在Android設(shè)備上下載遠(yuǎn)端服務(wù)器上的圖片來進(jìn)行顯示,這里我整理出兩種比較好的方法來實(shí)現(xiàn)遠(yuǎn)程圖片的下載。

  方法一、直接通過Android官方提供的Http類訪來問遠(yuǎn)程服務(wù)器,這里AndroidHttpClient是SDK 2.2中新出的方法,API Level為8,大家需要注意下,靜態(tài)訪問可以直接調(diào)用,如果SDK版本較低可以考慮Apache的Http庫,當(dāng)然HttpURLConnection或URLConnection也可以。
  1. static Bitmap downloadBitmapByCwj(String url) {
  2.     final AndroidHttpClient client = AndroidHttpClient.newInstance("linux初學(xué)三月");
  3.     final HttpGet getRequest = new HttpGet(url);

  4.     try {
  5.         HttpResponse response = client.execute(getRequest);
  6.         final int statusCode = response.getStatusLine().getStatusCode();
  7.         if (statusCode != HttpStatus.SC_OK) {  
  8.             Log.e("cwjDebug", "Error " + statusCode + " while retrieving bitmap from " + url);  
  9.             return null;
  10.         }
  11.          
  12.         final HttpEntity entity = response.getEntity();
  13.         if (entity != null) {
  14.             InputStream inputStream = null;
  15.             try {
  16.                 inputStream = entity.getContent();  
  17.                 final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
  18.                 return bitmap;
  19.             } finally {
  20.                 if (inputStream != null) {
  21.                     inputStream.close();   
  22.                 }
  23.                 entity.consumeContent();
  24.             }
  25.         }
  26.     } catch (Exception e) {
  27.           getRequest.abort();
  28.         Log.e("Debug", "Error while retrieving bitmap from " + url, e.toString());
  29.     } finally {
  30.         if (client != null) {
  31.             client.close();
  32.         }
  33.     }
  34.     return null;
  35. }

復(fù)制代碼
這里提醒大家,BitmapFactory類的decodeStream方法在網(wǎng)絡(luò)超時(shí)或較慢的時(shí)候無法獲取完整的數(shù)據(jù),這里我們通過繼承FilterInputStream類的skip方法來強(qiáng)制實(shí)現(xiàn)flush流中的數(shù)據(jù),主要原理就是檢查是否到文件末端,告訴http類是否繼續(xù)。
  1. static class FlushedInputStream extends FilterInputStream {
  2.     public FlushedInputStream(InputStream inputStream) {
  3.         super(inputStream);
  4.     }

  5.     @Override
  6.     public long skip(long n) throws IOException {
  7.         long totalBytesSkipped = 0L;
  8.         while (totalBytesSkipped < n) {
  9.             long bytesSkipped = in.skip(n - totalBytesSkipped);
  10.             if (bytesSkipped == 0L) {
  11.                   int byte = read();
  12.                   if (byte < 0) {
  13.                       break;  // we reached EOF
  14.                   } else {
  15.                       bytesSkipped = 1; // we read one byte
  16.                   }
  17.            }
  18.             totalBytesSkipped += bytesSkipped;
  19.         }
  20.         return totalBytesSkipped;
  21.     }
  22. }
復(fù)制代碼
方法二、通過AsyncTask的異步任務(wù)

  從Android 1.5固件開發(fā)平臺(tái)開始Google提供了一個(gè)AsyncTask類來幫助開發(fā)者處理異步下載的實(shí)現(xiàn),相對(duì)于Thread線程而言他可以運(yùn)行在UI線程中,其內(nèi)部的實(shí)現(xiàn)是從Java 5開始的并發(fā)包c(diǎn)oncurrent中派生而來的,總體實(shí)現(xiàn)比較可靠就是資源占用略大了些。不過使用起來比簡(jiǎn)單。這里下載圖片類ImageDownloader類的download方法可以很好的處理實(shí)現(xiàn)UI顯示等操作,參數(shù)一url為遠(yuǎn)程server上文件的url,第二個(gè)參數(shù)為imageview對(duì)象,可以直接讓imageview顯示出下載的遠(yuǎn)程圖片。
  1. public class ImageDownloader {

  2.     public void download(String url, ImageView imageView) {
  3.             BitmapDownloaderTask task = new BitmapDownloaderTask(imageView);
  4.             task.execute(url);
  5.         }
  6.     }

  7. }
復(fù)制代碼
有關(guān)具體的AsyncTask類實(shí)現(xiàn),考慮到圖片可能較大,為了給JVM充分的空間存儲(chǔ),這里推薦大家使用弱引用來保存ImageView對(duì)象。
  1. class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> {
  2.     private String url;
  3.     private final WeakReference<ImageView> imageViewReference;  //使用WeakReference解決內(nèi)存問題

  4.     public BitmapDownloaderTask(ImageView imageView) {
  5.         imageViewReference = new WeakReference<ImageView>(imageView);
  6.     }


  7.   @Override
  8.     protected Bitmap doInBackground(String... params) {   //實(shí)際的下載線程,內(nèi)部其實(shí)是concurrent線程,所以不會(huì)阻塞
  9.    
  10.          return downloadBitmap(params[0]);   

  11.   }

  12.     @Override
  13.      protected void onPostExecute(Bitmap bitmap) {   //下載完后執(zhí)行的
  14.         if (isCancelled()) {
  15.             bitmap = null;
  16.         }

  17.         if (imageViewReference != null) {
  18.             ImageView imageView = imageViewReference.get();
  19.             if (imageView != null) {
  20.                 imageView.setImageBitmap(bitmap);  //下載完設(shè)置imageview為剛才下載的bitmap對(duì)象
  21.             }
  22.         }
  23.     }
  24. }
復(fù)制代碼

評(píng)分

參與人數(shù) 1可用積分 +6 收起 理由
0vk0 + 6 寫得不錯(cuò)

查看全部評(píng)分

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2010-07-23 11:33 |只看該作者
寫得不錯(cuò),支持一下

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2010-07-24 23:28 |只看該作者
寫的不錯(cuò), 繼續(xù)寫寫方法三唄, 最好把那原文都翻譯一遍

這里沒有明白,如果網(wǎng)速慢會(huì)是什么情況? 圖片顯示一半?還是decode失敗?
BitmapFactory類的decodeStream方法在網(wǎng)絡(luò)超時(shí)或較慢的時(shí)候無法獲取完整的數(shù)據(jù),這里我們通過繼承FilterInputStream類的skip方法來強(qiáng)制實(shí)現(xiàn)flush流中的數(shù)據(jù),主要原理就是檢查是否到文件末端,告訴http類是否繼續(xù)

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2010-07-25 19:34 |只看該作者
方法三我不知道,感覺其的方法都不是很好,第一種方法我比較喜歡

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2010-07-25 19:35 |只看該作者
本帖最后由 linux初學(xué)三月 于 2010-07-25 19:37 編輯
寫的不錯(cuò), 繼續(xù)寫寫方法三唄, 最好把那原文都翻譯一遍

這里沒有明白,如果網(wǎng)速慢會(huì)是什么情況? 圖 ...
bborn 發(fā)表于 2010-07-24 23:28



     如果網(wǎng)速慢,將無法顯示圖片。當(dāng)然,一般這里的遠(yuǎn)程都是本地網(wǎng)絡(luò),不會(huì)出現(xiàn)這樣的問題

   只是增加容錯(cuò)

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2010-08-03 15:51 |只看該作者
先收藏了

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2010-08-07 16:48 |只看該作者
原創(chuàng)的東西要看看

論壇徽章:
59
2015七夕節(jié)徽章
日期:2015-08-24 11:17:25ChinaUnix專家徽章
日期:2015-07-20 09:19:30每周論壇發(fā)貼之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38榮譽(yù)版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年紀(jì)念徽章
日期:2015-07-20 11:05:27IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-07-20 11:05:34操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-07-20 11:05:36程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-07-20 11:05:40數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2015-07-20 11:05:432015年辭舊歲徽章
日期:2015-07-20 11:05:44
8 [報(bào)告]
發(fā)表于 2010-08-08 22:20 |只看該作者
我把樓主的帖子轉(zhuǎn)到其他的Android論壇了。希望樓主別見怪。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP