天天看點

淺談Volley網絡架構(三)

上兩篇文章都介紹的是請求網絡資料,這篇文章介紹一下,利用Volley和圖檔打交道。

ImageRequest的使用

細心的你一定會發現,凡是對象名稱後面跟Request的,都是繼承了Request這個抽象類,那麼ImageRequest也繼承自Request。如果你學會了StringRequest和JsonRequest,那這個ImageReqeust用法也是一樣,因為他們都是一個爹嘛!看如下代碼:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.example.mydemo.MainActivity" >

    <ImageView
        android:id="@+id/imageView_show" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</RelativeLayout>
           

這就是一個用于顯示圖檔的布局,一會用于将請求拿到的圖檔設定上。下面的代碼才是ImageRequest的用法

//請求隊列
        RequestQueue queues = Volley.newRequestQueue(MainActivity.this);
        //請求位址
        String url = "http://u.thsi.cn/fileupload/data/Input/2012/12/26/d72ea3717426e00fc5f2b745ba800fd7.jpg";
        //開始請求
        ImageRequest imageRequest = new ImageRequest(url, new Listener<Bitmap>() {

            @Override
            public void onResponse(Bitmap response) {
                ImageView imageView = (ImageView)findViewById(R.id.imageView_show);
                imageView.setImageBitmap(response);

            }
        }, , , Config.RGB_565, new ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                //請求失敗!
            }
        });
        //添加到隊列中去
        queues.add(imageRequest);
           

這裡的建立RequestQueue和add就不用說了,我們就一起看一下ImageRequest,可見用法都是一樣,但是參數有變化

參數一:你一看就知道了,URL伺服器位址,這個一定要放圖檔的URL,不然就不會正常顯示了

參數二:請求成功的回調函數,這個得到的結果是一個Bitmap,我在布局中寫了一個ImageView,利用setImageBitmap将請求的圖檔設定上去

參數三和參數四:設定圖檔的最大寬度和高度,如果寫0,0就代表任他放縱,不管圖檔多大,都不會進行壓縮

參數五:指定圖檔的顔色屬性,這裡Bitmap.Config類提供了4種,其中ARGB_8888的顔色品質是最高的,但是他的像素占用的位元組大小比例是

1px : 4byte是RGB_565的兩倍。

參數六:請求失敗的回調函數

這樣,利用ImageRequest來請求網絡圖檔就OK了。你一定覺得特别簡單吧?還沒完!Volley中單獨的ImageRequest對象操作圖檔是不夠的,它還為我們提供了其他的對象

ImageLoader的用法

看名字雖然他不是Request的兒子,但是用法也是不難。他的好處在于對對圖檔進行緩存,還可以過濾掉重複的連結。

四行代碼幫你搞定

RequestQueue mQueue = Volley.newRequestQueue(MainActivity.this);
        ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());
        ImageListener listener = ImageLoader.getImageListener(imageView,  R.drawable.ic_launcher, R.drawable.ic_launcher);
        imageLoader.get("http://www.lcxw.cn/d/file/news/yule/tupian/2016-03-03/fddc8014b90136bb9efcd1c6cdc5c7d7.jpg", listener, , );
           

第一行仍然是建立請求隊列

第二行建立ImageLoader對象,參數一是放一個請求隊列,參數二放一個緩存對象,這個緩存類最後我會寫上

第三行建立ImageListener對象,這個參數分别是設定圖檔的顯示位置、加載中顯示的圖檔、請求失敗顯示的圖檔

最後一行是用ImageLoader通過get方法,指明圖檔的URL,還有剛剛建立好的ImageListener,最後1000,1000代表圖檔最大寬高,如不限制,就不用寫。

緩存類,BitmapChache

public class BitmapCache implements ImageCache
{  
    private LruCache<String, Bitmap> mCache;  

    @SuppressLint("NewApi")
    public BitmapCache() 
    {  
        int maxSize =  *  * ;  
        mCache = new LruCache<String, Bitmap>(maxSize) 
        {  
            @Override  
            protected int sizeOf(String key, Bitmap bitmap) 
            {  
                return bitmap.getRowBytes() * bitmap.getHeight();  
            }  
        };  
    }  

    @SuppressLint("NewApi")
    @Override  
    public Bitmap getBitmap(String url) 
    {  
        return mCache.get(url);  
    }  

    @SuppressLint("NewApi")
    @Override  
    public void putBitmap(String url, Bitmap bitmap)
    {  
        mCache.put(url, bitmap);  
    }  
}  
           

自定義控件-NetworkImageView

Volley還提供了一個控件,叫NetwordImageView,用法也是非常簡單了。直接上代碼,一看就會。

<com.android.volley.toolbox.NetworkImageView
        android:id="@+id/imageView_show"
        android:layout_width="200dp"
        android:layout_height="200dp">
    </com.android.volley.toolbox.NetworkImageView>  
           

這是布局檔案,用法和ImageView一樣,下面是設定這個布局中控件的代碼,findViewById我就不寫了

/*1*/RequestQueue mQueue = Volley.newRequestQueue(MainActivity.this);

        /*2*/ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());

        /*3*/networkImageView.setDefaultImageResId(R.drawable.ic_launcher);  

        /*4*/networkImageView.setErrorImageResId(R.drawable.ic_launcher);  
                                        /*5*/networkImageView.setImageUrl("http://b.hiphotos.baidu.com/image/pic/item/08f790529822720ea5d058ba7ccb0a46f21fab50.jpg",imageLoader); 
           

第一行和第二行你讓我說我也不想說了,和介紹ImageLoader用法是一樣的。第三行是設定預設圖檔,第四行是設定加載錯誤圖檔,最後一行是設定圖檔位址和ImageLoader對象。

到這裡,Volley網絡架構的使用就全局介紹完了。如果有什麼不懂的或者有意見建議的,歡迎QQ騷擾或部落格留言,997797281!

繼續閱讀