Android多執行緒下載遠端圖片
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次總結中已經為大家分享過有關技術的一些基本要領,我們先一起簡單回顧下它的基本原理。什麼是多執行緒下載?多執行緒下載其