上兩篇文章都介紹的是請求網絡資料,這篇文章介紹一下,利用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!