1. 程式人生 > >volley中圖片載入

volley中圖片載入

volley圖片載入有三種方式:

記得:Volley中已經實現了磁碟快取了,檢視原始碼得知通過

context.getCacheDir()獲取到了 /data/data/<application package>/cache內部儲存路徑,預設大小是5MB.所以我們只需要再實現記憶體快取就可以了

1. ImageRequest

 1 singleImg=(ImageView)findViewById(R.id.volley_img_single_imgeview);
 2         ImageRequest imgRequest=new ImageRequest(url, new
Response.Listener<Bitmap>() { 3 @Override 4 public void onResponse(Bitmap arg0) { 5 // TODO Auto-generated method stub 6 singleImg.setImageBitmap(arg0); 7 } 8 }, 300, 200, Config.ARGB_8888, new ErrorListener(){ 9
@Override 10 public void onErrorResponse(VolleyError arg0) { 11 // TODO Auto-generated method stub 12 13 } 14 }); 15 mRequestQueue.add(imgRequest);

可以看到,ImageRequest的建構函式接收六個引數,第一個引數就是圖片的URL地址,這個沒什麼需要解釋的。第二個引數是圖片請求成功的回撥,這裡我們把返回的Bitmap引數設定到ImageView中。第三第四個引數分別用於指定允許圖片最大的寬度和高度,如果指定的網路圖片的寬度或高度大於這裡的最大值,則會對圖片進行壓縮,指定成0的話就表示不管圖片有多大,都不會進行壓縮。第五個引數用於指定圖片的顏色屬性,Bitmap.Config下的幾個常量都可以在這裡使用,其中ARGB_8888可以展示最好的顏色屬性,每個圖片畫素佔據4個位元組的大小,而RGB_565則表示每個圖片畫素佔據2個位元組大小。第六個引數是圖片請求失敗的回撥,這裡我們當請求失敗時在ImageView中顯示一張預設圖片。

最後將這個ImageRequest物件新增到RequestQueue裡就可以了

2. ImageLoader

 1 RequestQueue mRequestQueue = Volley.newRequestQueue(this);
 2         final LruCache<String, Bitmap> mImageCache = new LruCache<String, Bitmap>(
 3                 20);
 4         ImageCache imageCache = new ImageCache() {
 5             @Override
 6             public void putBitmap(String key, Bitmap value) {
 7                 mImageCache.put(key, value);
 8             }
 9 
10             @Override
11             public Bitmap getBitmap(String key) {
12                 return mImageCache.get(key);
13             }
14         };
15         ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache);
16         // imageView是一個ImageView例項
17         // ImageLoader.getImageListener的第二個引數是預設的圖片resource id
18         // 第三個引數是請求失敗時候的資源id,可以指定為0
19         ImageListener listener = ImageLoader
20                 .getImageListener(imageView, android.R.drawable.ic_menu_rotate,
21                         android.R.drawable.ic_delete);
22         mImageLoader.get(url, listener);

可以看出ImageLoader這個類需要一個Request的例項以及一個ImageCache的例項。圖片通過一個URL和一個ImageListener例項的get()方法就可以被載入。從哪裡,ImageLoader會檢查ImageCache,而且如果快取裡沒有圖片就會從網路上獲取。Volley的ImageCache介面允許你使用你喜歡的L1快取實現。不幸的是Volley沒有提供預設的實現。在I/O的介紹中展示了BitmapLruCache的一點程式碼片段,但是Volley這個庫本身並不包含任何相關的實現。

ImageCache介面有兩個方法,getBitmap(String url)和putBitmap(String url, Bitmap bitmap).這兩個方法足夠簡單直白,他們可以新增任何的快取實現。

3.NetworkImageView

除了以上兩種方式之外,Volley還提供了第三種方式來載入網路圖片,即使用NetworkImageView。不同於以上兩種方式,NetworkImageView是一個自定義控制,它是繼承自ImageView的,具備ImageView控制元件的所有功能,並且在原生的基礎之上加入了載入網路圖片的功能。NetworkImageView控制元件的用法要比前兩種方式更加簡單,大致可以分為以下五步:

1. 建立一個RequestQueue物件。

2. 建立一個ImageLoader物件。

3. 在佈局檔案中新增一個NetworkImageView控制元件。

4. 在程式碼中獲取該控制元件的例項。

5. 設定要載入的圖片地址。

其中,第一第二步和ImageLoader的用法是完全一樣的,因此這裡我們就從第三步開始學習了。首先修改佈局檔案中的程式碼,在裡面加入NetworkImageView控制元件,如下所示

XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send Request" />
    
    <com.android.volley.toolbox.NetworkImageView 
        android:id="@+id/network_image_view"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_gravity="center_horizontal"
        />

</LinearLayout>

接著在Activity獲取到這個控制元件的例項,程式碼如下所示:

networkImageView = (NetworkImageView) findViewById(R.id.network_image_view); 

NetworkImageView控制元件的例項之後,我們可以呼叫它的setDefaultImageResId()方法、setErrorImageResId()方法和setImageUrl()方法來分別設定載入中顯示的圖片, 載入失敗時顯示的圖片,以及目標圖片的URL地址,如下所示:

1 networkImageView.setDefaultImageResId(R.drawable.default_image);  
2 
3 networkImageView.setErrorImageResId(R.drawable.failed_image); 
4 
5 networkImageView.setImageUrl("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", imageLoader); 

好了,就是這麼簡單,現在重新執行一下程式,你將看到和使用ImageLoader來載入圖片一模一樣的效果,這裡我就不再截圖了。

這時有的朋友可能就會問了,使用ImageRequest和ImageLoader這兩種方式來載入網路圖片,都可以傳入一個最大寬度和高度的引數來對圖片進行壓縮,而NetworkImageView中則完全沒有提供設定最大寬度和高度的方法,那麼是不是使用NetworkImageView來載入的圖片都不會進行壓縮呢?

其實並不是這樣的,NetworkImageView並不需要提供任何設定最大寬高的方法也能夠對載入的圖片進行壓縮。這是由於NetworkImageView是一個控制元件,在載入圖片的時候它會自動獲取自身的寬高,然後對比網路圖片的寬度,再決定是否需要對圖片進行壓縮。也就是說,壓縮過程是在內部完全自動化的,並不需要我們關心,NetworkImageView會始終呈現給我們一張大小剛剛好的網路圖片,不會多佔用任何一點記憶體,這也是NetworkImageView最簡單好用的一點吧。

當然了,如果你不想對圖片進行壓縮的話,其實也很簡單,只需要在佈局檔案中把NetworkImageView的layout_width和layout_height都設定成wrap_content就可以了,這樣NetworkImageView就會將該圖片的原始大小展示出來,不會進行任何壓縮。

這樣我們就把使用Volley來載入網路圖片的用法都學習完了。

下一篇我們繼續介紹Volley中的json處理..........

相關推薦

volley圖片載入

volley圖片載入有三種方式: 記得:Volley中已經實現了磁碟快取了,檢視原始碼得知通過 context.getCacheDir()獲取到了 /data/data/<application package>/cache內部儲存路徑,預設大小是5MB.所以我們只需要再實現記憶體快取就可以了

原生JS判斷頁面圖片載入完成

自己寫的判斷頁面中圖片載入完成的方法,用原生JS完成,不用jq主要考慮在不載入jq的情況下,程式碼可以正常執行 判斷指定ID的盒子中所有圖片載入,demo程式碼如下: <!DOCTYPE HTML> <html> <head> &l

java 標籤圖片載入不完全問題

第一步,檢視要載入的圖片的大小資訊,例如1025*768.(具體方法可以用window是自帶畫圖工具,點選重新調整大小,點選畫素) 第二步,按百分比或畫素按需要調整圖片大小,把調整過後的圖片大小設定為

Android圖片載入框架Picasso的使用

技術要點 基本顯示(非同步載入,圖片壓縮,圖片快取) 載入中和載入錯誤的圖片顯示 設定圖片尺寸(Resize)、縮放(Scale)和裁剪(Crop) 圖片旋轉 設定轉換器 取消預設的記憶體快取 設定快取指示器 請求優先順序設定 圖片還未加載出來時取消

Android的listview圖片載入的優化

費了好大勁寫玩才發現早就有現成的三方(glide)了,還是記下來吧。 為什麼優化?因為圖片大了很容易超出記憶體導致崩潰。 原理很簡單,壓縮圖片,儲存。 工具類。 import android.graphics.Bitmap; import android.graphics.

React Native ListView圖片載入優化處理(三)

在手機應用中,圖片列表的滾動操作是非常常見的,而且這個功能一般使用者的期望都比較高,需要很不錯的使用者體驗。在上一篇文章中(點選進入),我們主要分享瞭如何實現React Native中的圖片快取,在本文中我將會給大家帶來在圖片列表滾動過程中如何進行優化Li

vue圖片載入與顯示預設圖片

  原部落格地址:https://www.cnblogs.com/xulei1992/p/6558294.html     <div class="content-show-img">  <div class="show-img">    <img cl

iOS 如何計算圖片載入記憶體所佔的大小

首先圖片自動縮放到2的n次方大小,例如200 * 300畫素 會變成256 * 512大小。 圖片記憶體大小的計算公式 寬度 * 高度 * bytesPerPixel/8。 bytesPerPixel : 每個畫素所佔的位元組數。 RGB顏色空間下 每個顏色分量由8位組成

BitmapFactory.decodeStream方法及如何將Raw圖片載入為Bitmap

結論 將輸入流傳遞給 BitmapFactory.decodeStream(in) 方法,建立完成 Bitmap 之後,開發者一定要主動去關閉這個輸入流。否則,對輸入流執行 reset() 方法,則可以重新獲取輸入流中的所有資料,並且創建出一張新的圖片。 從res-raw目錄下獲取一張Bit

網頁圖片載入的原理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

listview載入圖片過程圖片載入不一致原理。

//主介面佈局 <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com

一對一視訊交友原始碼關於圖片載入和部分自定義控制元件的原始碼

有這麼一部分原始碼,他們不如音視訊採集、播放部分的原始碼顯得那麼重要,但他們的存在使頁面看起來更美觀流暢,他們就是: 一、關於圖片載入的一段程式碼: 1、載入原圖,即沒有壓縮、裁剪、變換之前的圖,保持了原圖的大小、尺寸和解析度。 public static void displaySou

【轉】QmlImage載入圖片再不同平臺的方式

今天用QML中Image載入win系統下的本地路徑圖片的時候, 發現無論加絕對路徑或file://+path都打不開,就很奇怪,經過一番 查閱發現,各個系統的載入方式都不相同, win系統:     Image {             id:  preview

載入 Bundle 圖片的三種方法

第一種方法 NSString *path = [[NSBundle mainBundle] pathForResource:@"myBundle" ofType:@"bundle"]; NSBun

Android 圖片載入框架 Volley框架原始碼 以及Picasso和Glide比較

首先了解一下,它是封裝了HTTPConnection和HTTPClient類的一個框架, 適用於資料量少但是通訊頻繁的情況,如載入圖片; 就拿StringRequest(用來請求字串的)舉例: Volley的順序是 :  Http請求-------再接受響應   只

mfc圖片控制元件上載入PNG圖片

就一個載入png圖片的程式弄了一下午,想哭。 ***在stadfx.h檔案中新增 #include <comdef.h>//初始化一下com口   #include "gdiplus.h"  using namespace Gdiplus;  #pragma

列表Glide載入圖片大小顯示不正常問題

Glide載入圖片時大時小 前言:最近在專案中發現了一個奇怪的現象,在列表的item佈局中使用了glide來載入網路圖片,奇怪的現象出現了…同一張圖,同一份資料,有的時候顯示正常,有的時候該圖片顯示出來會稍微小一圈… 解決辦法:百思不得其解,找了很多資料,以為對recyclervie

常用圖片載入框架比較(Glide、volley、Picasso)

             Volley                      一、ImageRequest:                                    來對網路圖片進行請

AndroidWebView載入Html圖片新增點選事件

    基本的思路: (1)WebView來載入HTML。 (2)向HTML中注入JavaScript,利用JavaScript來呼叫Android中的方法(執行一些跳轉的操作等等)。  首先你必須有一個HTML或者是一個地址,或者是存到本地的一個檔案。我這裡使用的是存到本