1. 程式人生 > >Android多執行緒下載遠端圖片

Android多執行緒下載遠端圖片

很多時候我們需要在Android裝置上下載遠端伺服器上的圖片進行顯示,今天Android123整理出兩種比較好的方法來實現遠端圖片的下載。  方法一、直接通過Android提供的Http類訪問遠端伺服器,這裡AndroidHttpClient是SDK 2.2中新出的方法,API Level為8,大家需要注意下,靜態訪問可以直接呼叫,如果SDK版本較低可以考慮Apache的Http庫,當然HttpURLConnection或URLConnection也可以。
   static Bitmap downloadBitmapByCwj(String url) { 
    final AndroidHttpClient client = AndroidHttpClient.newInstance("Android123"); 
    final HttpGet getRequest = new HttpGet(url); 

    try { 
        HttpResponse response = client.execute(getRequest); 
        final int statusCode = response.getStatusLine().getStatusCode(); 
        if (statusCode != HttpStatus.SC_OK) {  
            Log.e("cwjDebug", "Error " + statusCode + " while retrieving bitmap from " + url);  
            return null; 
        } 
         
        final HttpEntity entity = response.getEntity(); 
        if (entity != null) { 
            InputStream inputStream = null; 
            try { 
                inputStream = entity.getContent();  
                final Bitmap bitmap = BitmapFactory.decodeStream(inputStream); 
                return bitmap; 
            } finally { 
                if (inputStream != null) { 
                    inputStream.close();   
                } 
                entity.consumeContent(); 
            } 
        } 
    } catch (Exception e) { 
          getRequest.abort(); 
        Log.e("android123Debug", "Error while retrieving bitmap from " + url, e.toString()); 
    } finally { 
        if (client != null) { 
            client.close(); 
        } 
    } 
    return null; 
}
  這裡Android開發網提醒大家,BitmapFactory類的decodeStream方法在網路超時或較慢的時候無法獲取完整的資料,這裡我們通過繼承FilterInputStream類的skip方法來強制實現flush流中的資料,主要原理就是檢查是否到檔案末端,告訴http類是否繼續。
static class FlushedInputStream extends FilterInputStream { 
    public FlushedInputStream(InputStream inputStream) { 
        super(inputStream); 
    } 

    @Override 
    public long skip(long n) throws IOException { 
        long totalBytesSkipped = 0L; 
        while (totalBytesSkipped < n) { 
            long bytesSkipped = in.skip(n - totalBytesSkipped); 
            if (bytesSkipped == 0L) { 
                  int byte = read(); 
                  if (byte < 0) { 
                      break;  // we reached EOF 
                  } else { 
                      bytesSkipped = 1; // we read one byte 
                  } 
           } 
            totalBytesSkipped += bytesSkipped; 
        } 
        return totalBytesSkipped; 
    } 
}
  方法二、AsyncTask非同步任務
  從Android 1.5韌體開始Google提供了一個AsyncTask類來幫助開發者處理非同步下載的實現,相對於Thread而言他可以執行在UI執行緒中,其內部的實現是從Java 5開始的併發包concurrent中派生而來的,總體實現比較可靠就是資源佔用略大了些。不過使用起來比簡單。這裡下載圖片類ImageDownloader類的download方法可以很好的處理實現UI顯示等操作,引數一url為遠端server上檔案的url,第二個引數為imageview物件,可以直接讓imageview顯示出下載的遠端圖片。
  public class ImageDownloader { 

    public void download(String url, ImageView imageView) { 
            BitmapDownloaderTask task = new BitmapDownloaderTask(imageView); 
            task.execute(url); 
        } 
    } 

}
有關具體的AsyncTask類實現,考慮到圖片可能較大,為了給JVM充分的空間儲存,這裡Android123推薦大家使用弱引用來儲存ImageView物件。
class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> { 
    private String url; 
    private final WeakReference<ImageView> imageViewReference;  //使用WeakReference解決記憶體問題

    public BitmapDownloaderTask(ImageView imageView) { 
        imageViewReference = new WeakReference<ImageView>(imageView); 
    } 

    @Override 
    protected Bitmap doInBackground(String... params) {   //實際的下載執行緒,內部其實是concurrent執行緒,所以不會阻塞
   
         return downloadBitmap(params[0]);   
  } 

    @Override 
     protected void onPostExecute(Bitmap bitmap) {   //下載完後執行的
        if (isCancelled()) { 
            bitmap = null; 
        } 

        if (imageViewReference != null) { 
            ImageView imageView = imageViewReference.get(); 
            if (imageView != null) { 
                imageView.setImageBitmap(bitmap);  //下載完設定imageview為剛才下載的bitmap物件
            } 
        } 
    } 
}

相關推薦

Android執行下載遠端圖片

很多時候我們需要在Android裝置上下載遠端伺服器上的圖片進行顯示,今天Android123整理出兩種比較好的方法來實現遠端圖片的下載。  方法一、直接通過Android提供的Http類訪問遠端伺服器,這裡AndroidHttpClient是SDK 2.2中新出的方法,API Level為8,大家需要注意

android執行下載-HttpURLConnection

android多執行緒下載-HttpURLConnection private static String PATH = "http://192.168.37.2:8080/http/02.jpg"; public static void main(String[] args)

android 執行 切換視訊圖片使用心得

package com.tk.box.activity; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.ArrayList; import java.u

*Android 執行下載 仿下載助手

今天帶來一個多執行緒下載的 例子。先看一下效果,點選 下載 開始下載,同時顯示下載進度,下載完成,變成程 安裝,點選安裝 提示 安裝應用。介面效果執行緒池 ThreadPoolExecutor在下面介紹

Android 執行下載檔案原理霸氣解析介紹 -----檔案的下載(3)

1、首先我們先建立好下載的位置–根據url建立檔案。 /** * <p>Title: FlieStorageManager</p > * <p>Description: TODO</p > * <

android 執行下載+GreenDao儲存狀態+ijkplayer播放快取後的視訊

今天我們要做的是一個多執行緒下載,然後用GreenDao去儲存多執行緒中的一些資訊.下載完成之後,利用IJKplayer播放我們快取好的視訊 該我上場表演啦,哈哈哈 第一步.匯入依賴 GreenDao: project的build.gradle中新增

Android執行下載APk+自動安裝

DialogUtils import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.con

Android執行分析之一:使用Thread非同步下載影象

Android多執行緒分析之一:使用Thread非同步下載影象 羅朝輝 (http://blog.csdn.net/kesalin) CC 許可,轉載請註明出處 打算整理一下對 Android Framework 中多執行緒相關知識的理解,主要集中在 Fra

android執行斷點下載

多執行緒斷電xia下載,通過設定執行緒的數量,動態獲取下載檔案執行緒的個數,這是本人用於練習所寫demo,註釋很詳細,用於初學者參考使用。 MainActivity.java頁面   package com.dahui.download; import java.io.Buf

Android核心技術-day05-05-安卓下的執行下載(帶ProgressBar)有bug版

package com.gaozewen.multidownloader; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; impor

Android核心技術-day05-04-JavaSE執行下載

package com.gaozewen.lib; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import ja

Android原生下載(下篇)檔案下載+執行下載

零、前言 1.上篇實現了單執行緒的單檔案下載,本篇將講述多個檔案的多執行緒下載,在此之前希望你先弄懂上篇 2.本篇將用到上篇之外的技術: 多執行緒、執行緒池(簡)、RecyclerView、資料庫多執行緒訪問下的注意點、volatile AtomicLong(簡) 最終靜態的效果

android執行暫停下載-HttpURLConnection

android多執行緒暫停下載-HttpURLConnection private EditText et_path; private LinearLayout ll_pbs; @Override protected void onCreate(Bundle sa

Android實現執行下載檔案,支援斷點

本篇部落格主要介紹多執行緒去下載檔案,以下載多個app為例。不管去下在app,音視訊等檔案,實現起來都一樣。篇幅有點長,先貼張美女圖看看 正在下載的效果圖 下載完成效果圖 小編的下載路徑是放在sd卡的絕對路徑中,方便驗證! 工程目錄圖 介紹下每

執行 下載圖片

# coding=utf-8 import requests from lxml import etree # 執行緒庫 from concurrent import futures def get_url(url): headers = { 'Host': 'www.d

執行下載圖片的簡單例子

原文 package com.example.kirito.myapplication.testdownload; import android.os.Environment; import android.os.Handler; import android.os.Me

Android 實現執行下載檔案+斷點續傳

                            Android 多執行緒下載檔案+斷點續傳       在專案快要結束的時候,發現了app沒有版本更新的功能,於是找到一些過去的資料,在app上應用完成了版本更新,現在記錄一下apk的下載,也就是如何通過多執行緒將ap

Android實現執行下載並顯示通知

1、前言 相信大家都使用過一些可以下載檔案的 App,在下載列表中通常都會顯示一個進度條實時地更新下載進度,現在的下載都是斷點重傳的,也就是在暫停後,重新下載會依照之前進度接著下載。 我們這個下載的案例是有多個執行緒同時下載一個任務,並能提供多個檔案同時下載

iOS【執行網路之圖片下載框架之SDWebImage】

效果: 程式碼: - (NSArray *)apps { if (!_apps) { NSArray *dictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pat

android 執行斷點續傳下載

今天跟大家一起分享下android開發中比較難的一個環節,可能很多人看到這個標題就會感覺頭很大,的確如果沒有良好的編碼能力和邏輯思維,這塊是很難搞明白的,前面2次總結中已經為大家分享過有關技術的一些基本要領,我們先一起簡單回顧下它的基本原理。什麼是多執行緒下載?多執行緒下載其