當前位置:首頁 » 安卓系統 » android非同步載入網路圖片

android非同步載入網路圖片

發布時間: 2024-09-30 09:13:04

❶ android 如何獲取遠程文件的內所有圖片

大家都知道,在android應用中UI線程5秒沒響應的話就會拋出無響應異常,對於遠程獲取大的資源來說,這種異常還是很容易就會拋出來的,那麼怎麼避免這種問題的產生。在android中提供兩種方法來做這件事情:
啟動一個新的線程來獲取資源,完成後通過Handler機制發送消息,並在UI線程中處理消息,從而達到在非同步線程中獲取圖片,然後通過Handler Message來更新UI線程的過程。
使用android中提供的AsyncTask來完成。

具體的做法這里就不介紹了,查下API就可以了,或者是google、下。這里主要來說本地緩存
本地緩存
對於圖片資源來說,你不可能讓應用每次獲取的時候都重新到遠程去下載(ListView),這樣會浪費資源,但是你又不能讓所有圖片資源都放到內存中去(雖然這樣載入會比較快),因為圖片資源往往會佔用很大的內存空間,容易導致OOM。那麼如果下載下來的圖片保存到SDCard中,下次直接從SDCard上去獲取呢?這也是一種做法,我看了下,還是有不少應用採用這種方式的。採用LRU等一些演算法可以保證sdcard被佔用的空間只有一小部分,這樣既保證了圖片的載入、節省了流量、又使SDCard的空間只佔用了一小部分。另外一種做法是資源直接保存在內存中,然後設置過期時間和LRU規則。
sdcard保存:

在sdcard上開辟一定的空間,需要先判斷sdcard上剩餘空間是否足夠,如果足夠的話就可以開辟一些空間,比如10M
當需要獲取圖片時,就先從sdcard上的目錄中去找,如果找到的話,使用該圖片,並更新圖片最後被使用的時間。如果找不到,通過URL去download
去伺服器端下載圖片,如果下載成功了,放入到sdcard上,並使用,如果失敗了,應該有重試機制。比如3次。
下載成功後保存到sdcard上,需要先判斷10M空間是否已經用完,如果沒有用完就保存,如果空間不足就根據LRU規則刪除一些最近沒有被用戶的資源。
關鍵代碼:
保存圖片到SD卡上

❷ Android客戶端訪問網路時,volley與okHttp,哪一個更好

OkHttp
物理質量
使用OkHttp需要 okio.jar (80k), okhttp.jar(330k)這2個jar包,總大小差不多400k,加上自己的封裝,差不多得410k。
功能介紹
Square 公司開源的 OkHttp 是一個專注於連接效率的 HTTP 客戶端。OkHttp 提供了對 HTTP/2 和 SPDY 的支持,並提供了連接池,GZIP 壓縮和 HTTP 響應緩存功能。
優點
支持http請求,https請求。
支持文件下載。
使用的是HttpURLConnection,不要擔心android版本的變換。(至少目前是都支持的)。
支持get,post請求。
基於Http的文件上傳
載入圖片。
缺點
比如callback回來是在線程裡面, 不能刷新UI,需要我們手動處理。
封裝比較麻煩。
Volley
物理質量
使用Volley 需要Volley.jar(120k),加上自己的封裝最多140k。
功能簡述
Volley是Goole在2013年Google I/O大會上推出了一個新的網路通信框架,它是開源的。Volley 的特點:特別適合數據量小,通信頻繁的網路操作。
優點
非常適合進行數據量不大,但通信頻繁的網路操作。
內部分裝了非同步線程。
支持get,post網路請求。
圖片下載。
可直接在主線程調用服務端並處理返回結果。
可以取消請求,容易擴展,面向介面編程
缺點
對大文件下載 Volley的表現非常糟糕。
只支持http請求。
在BasicNetwork中判斷了statusCode(statusCode < 200 || statusCode > 299),如果合條件直
圖片載入性能一般。
使用的是httpclient,HttpURLConnection。不過在android 6.0不支持httpclient了,如果想支持得添加org.apache.http.legacy.jar。
總結
在我們當前的項目 xxxSDK,xxx商城裡面,使用volley就可以了,畢竟經過了日活幾十萬的測試,至少穩定性是沒有問題的。okhttp暫時還用不上。後續如果要使用okhttp,可以再深入okhttp,給項目做重構。
不過既然轉戰Android studio,網路請求還是推薦使用Retrofit2
Retrofit 是在OkHttp上封裝的,可以參考下 Volley vs Retrofit
http://blog.csdn.net/hwz2311245/article/details/46845271

❸ android listview viewholder 錯亂怎麼解決代碼

在沒有用viewHolder的情況下,listView表現效率低下。如果載入的數量過多則會一點點的消耗內存,直到拋出oom。開始非同步載入圖片會出現圖片錯位的問題,後來查閱資料將holder里邊的圖片地址和圖片一一對應起來,在非同步載入的回調函數中將其替換回來。

holder.thumb_image.setTag(hotel.getHotelTitlePic());
//避免圖標錯位,在非同步載入成功後替換回來

ImageView imageView = (ImageView) listView.findViewWithTag(imageUrl);

if(imageView != null){

imageView.setImageDrawable(imageDrawable);
imageView.setTag("");

}
以上關鍵代碼解決圖片錯位問題。

下面是getView()方法

public View getView(int position, View rowView, ViewGroup parent){
final
MHotelInfo hotel = this.getItem(position);
if (rowView == null) {
holder =
new ViewHolder();
LayoutInflater inflater = ((Activity)
this.getContext())
.getLayoutInflater();
rowView =
inflater.inflate(R.layout.hotel_item_view, null);

holder.typeName =
(TextView) rowView.findViewById(R.id.hotelType);

holder.thumb_image=(ImageView)rowView.findViewById(R.id.img);// 縮略圖

holder.distance = (TextView) rowView.findViewById(R.id.distance);

rowView.setTag(holder);
}else{
holder = (ViewHolder)
rowView.getTag();
}

// 設置ListView的相關值

holder.thumb_image.setTag(hotel.getHotelTitlePic());
//避免圖標錯位,在非同步載入成功後替換回來

holder.typeName.setText(hotel.getTypeName());

if(null ==
hotel.getHotelTitlePic() || hotel.getHotelTitlePic().equals("")){
//如果沒有圖標就顯示默認圖標

holder.thumb_image.setImageResource(R.drawable.downloadfalse);

}else{
//非同步載入圖片

imageLoader.loadDrawable(hotel.getHotelTitlePic(), new ImageCallback() {

public void imageLoaded(Drawable imageDrawable, String imageUrl) {

ImageView imageView = (ImageView) listView.findViewWithTag(imageUrl);

if(imageView != null){

imageView.setImageDrawable(imageDrawable);
imageView.setTag("");

}
}
});
}

return
rowView;
}

static class ViewHolder {
TextView
typeName;
ImageView thumb_image;
}

但是ViewHolder為什麼是被設計成static類型的,本人一直沒弄清楚。在網上找了些資料但是一直沒能看到一個能說服我的理由。又說節省內存,保持對象的唯一性,還有說保持圖片不錯亂但是個人感覺都不怎麼靠譜。今天我試了下將static去掉照常運行沒感覺和以前有什麼區別。後來我查了下static類的一些特性,首先ViewHolder是一個內部類若是static類的話則不需要依賴外部類的對象。也就是說只有static的內部類的成員變數才可以被聲明成static類型,若內部類不是static類型的則不可以聲明靜態成員變數。不知道是不是static內部類的這個特性吸引了設計者?如果有誰清楚這個問題還請不吝賜教。

熱點內容
u盤加密啟動電腦 發布:2024-11-24 13:30:44 瀏覽:905
宣片腳本詞 發布:2024-11-24 13:30:33 瀏覽:493
pythonforif一行 發布:2024-11-24 13:28:19 瀏覽:393
伺服器集群怎麼實現 發布:2024-11-24 13:26:51 瀏覽:598
秒評源碼 發布:2024-11-24 13:24:30 瀏覽:125
聯想筆記本e450c怎麼看配置 發布:2024-11-24 13:22:23 瀏覽:86
c語言如何運行程序 發布:2024-11-24 13:20:03 瀏覽:448
訪問oracle其他用戶 發布:2024-11-24 13:18:32 瀏覽:68
年青人的游戲密碼一般是什麼 發布:2024-11-24 13:17:01 瀏覽:785
培訓室密碼是多少 發布:2024-11-24 13:16:21 瀏覽:76