W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
編寫:kesenhoo - 原文:http://developer.android.com/training/volley/request.html
這一課會(huì)介紹如何使用 Volley 支持的常用請(qǐng)求類型:
StringRequest
。指定一個(gè) URL 并在響應(yīng)回調(diào)中接收一個(gè)原始的字符串?dāng)?shù)據(jù)。請(qǐng)參考前一課的示例。ImageRequest
。指定一個(gè) URL 并在響應(yīng)回調(diào)中接收一個(gè)圖片。JsonObjectRequest
與 JsonArrayRequest
(均為 JsonRequest
的子類)。指定一個(gè) URL 并在響應(yīng)回調(diào)中獲取到一個(gè) JSON 對(duì)象或者 JSON 數(shù)組。如果我們需要的是上面演示的請(qǐng)求類型,那么我們很可能不需要實(shí)現(xiàn)一個(gè)自定義的請(qǐng)求。這節(jié)課會(huì)演示如何使用那些標(biāo)準(zhǔn)的請(qǐng)求類型。關(guān)于如何實(shí)現(xiàn)自定義的請(qǐng)求,請(qǐng)看下一課:實(shí)現(xiàn)自定義的請(qǐng)求。
Volley 為請(qǐng)求圖片提供了如下的類。這些類依次有著依賴關(guān)系,用來支持在不同的層級(jí)進(jìn)行圖片處理:
ImageRequest
—— 一個(gè)封裝好的,用來處理 URL 請(qǐng)求圖片并且返回一張解完碼的位圖(bitmap)。它同樣提供了一些簡(jiǎn)便的接口方法,例如指定一個(gè)大小進(jìn)行重新裁剪。它的主要好處是 Volley 會(huì)確保類似 decode,resize 等耗時(shí)的操作在工作線程中執(zhí)行。
ImageLoader
—— 一個(gè)用來處理加載與緩存從網(wǎng)絡(luò)上獲取到的圖片的幫助類。ImageLoader
是大量 ImageRequest
的協(xié)調(diào)器。例如,在 ListView
中需要顯示大量縮略圖的時(shí)候。ImageLoader
為通常的 Volley cache 提供了更加前瞻的內(nèi)存緩存,這個(gè)緩存對(duì)于防止圖片抖動(dòng)非常有用。這還使得在不阻塞或者延遲主線程的前提下實(shí)現(xiàn)緩存命中(這對(duì)于使用磁盤 I/O 是無法實(shí)現(xiàn)的)。ImageLoader
還能夠?qū)崿F(xiàn)響應(yīng)聯(lián)合(response coalescing),避免幾乎每一個(gè)響應(yīng)回調(diào)里面都設(shè)置 bitmap 到 view 上面。響應(yīng)聯(lián)合使得能夠同時(shí)提交多個(gè)響應(yīng),這提升了性能。
NetworkImageView
—— 在 ImageLoader
的基礎(chǔ)上建立,并且在通過網(wǎng)絡(luò) URL 取回的圖片的情況下,有效地替換 ImageView
。如果 view 從層次結(jié)構(gòu)中分離,NetworkImageView
也可以管理取消掛起請(qǐng)求。
下面是一個(gè)使用 ImageRequest
的示例。它會(huì)獲取 URL 上指定的圖片并顯示到 app 上。注意到,里面演示的 RequestQueue
是通過上一課提到的單例類實(shí)現(xiàn)的:
ImageView mImageView;
String url = "http://i.imgur.com/7spzG.png";
mImageView = (ImageView) findViewById(R.id.myImage);
...
// Retrieves an image specified by the URL, displays it in the UI.
ImageRequest request = new ImageRequest(url,
new Response.Listener() {
@Override
public void onResponse(Bitmap bitmap) {
mImageView.setImageBitmap(bitmap);
}
}, 0, 0, null,
new Response.ErrorListener() {
public void onErrorResponse(VolleyError error) {
mImageView.setImageResource(R.drawable.image_load_error);
}
});
// Access the RequestQueue through your singleton class.
MySingleton.getInstance(this).addToRequestQueue(request);
我們可以使用 ImageLoader
與 NetworkImageView
來有效地管理類似 ListView 等顯示多張圖片的情況。在 layout XML 文件中,我們以與使用 ImageView 差不多的方法使用 NetworkImageView
,例如:
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/networkImageView"
android:layout_width="150dp"
android:layout_height="170dp"
android:layout_centerHorizontal="true" />
我們可以使用 ImageLoader
自身來顯示一張圖片,例如:
ImageLoader mImageLoader;
ImageView mImageView;
// The URL for the image that is being loaded.
private static final String IMAGE_URL =
"http://developer.android.com/images/training/system-ui.png";
...
mImageView = (ImageView) findViewById(R.id.regularImageView);
// Get the ImageLoader through your singleton class.
mImageLoader = MySingleton.getInstance(this).getImageLoader();
mImageLoader.get(IMAGE_URL, ImageLoader.getImageListener(mImageView,
R.drawable.def_image, R.drawable.err_image));
然而,如果我們要做的是為 ImageView
進(jìn)行圖片設(shè)置,那么我們可以使用 NetworkImageView
來實(shí)現(xiàn),例如:
ImageLoader mImageLoader;
NetworkImageView mNetworkImageView;
private static final String IMAGE_URL =
"http://developer.android.com/images/training/system-ui.png";
...
// Get the NetworkImageView that will display the image.
mNetworkImageView = (NetworkImageView) findViewById(R.id.networkImageView);
// Get the ImageLoader through your singleton class.
mImageLoader = MySingleton.getInstance(this).getImageLoader();
// Set the URL of the image that should be loaded into this view, and
// specify the ImageLoader that will be used to make the request.
mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader);
上面的代碼是通過通過前一節(jié)課講到的單例類來訪問 RequestQueue
與 ImageLoader
。這種方法保證了我們的 app 創(chuàng)建這些類的單例會(huì)持續(xù)存在于 app 的生命周期。這對(duì)于 ImageLoader
(一個(gè)用來處理加載與緩存圖片的幫助類)很重要的原因是:內(nèi)存緩存的主要功能是允許非抖動(dòng)旋轉(zhuǎn)。使用單例模式可以使得 bitmap 的緩存比 activity 存在的時(shí)間長(zhǎng)。如果我們?cè)?activity 中創(chuàng)建 ImageLoader
,這個(gè) ImageLoader
有可能會(huì)在每次旋轉(zhuǎn)設(shè)備的時(shí)候都被重新創(chuàng)建。這可能會(huì)導(dǎo)致抖動(dòng)。
Volley 工具箱中提供了一種通過 DiskBasedCache
類實(shí)現(xiàn)的標(biāo)準(zhǔn)緩存。這個(gè)類能夠緩存文件到磁盤的指定目錄。但是為了使用 ImageLoader
,我們應(yīng)該提供一個(gè)自定義的內(nèi)存 LRC bitmap 緩存,這個(gè)緩存實(shí)現(xiàn)了 ImageLoader.ImageCache
接口。我們可能想把緩存設(shè)置成一個(gè)單例。關(guān)于更多的有關(guān)內(nèi)容,請(qǐng)參考建立請(qǐng)求隊(duì)列.
下面是一個(gè)內(nèi)存 LruBitmapCache
類的實(shí)現(xiàn)示例。它繼承 LruCache 類并實(shí)現(xiàn)了 ImageLoader.ImageCache
接口:
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
import android.util.DisplayMetrics;
import com.android.volley.toolbox.ImageLoader.ImageCache;
public class LruBitmapCache extends LruCache<String, Bitmap>
implements ImageCache {
public LruBitmapCache(int maxSize) {
super(maxSize);
}
public LruBitmapCache(Context ctx) {
this(getCacheSize(ctx));
}
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight();
}
@Override
public Bitmap getBitmap(String url) {
return get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap);
}
// Returns a cache size equal to approximately three screens worth of images.
public static int getCacheSize(Context ctx) {
final DisplayMetrics displayMetrics = ctx.getResources().
getDisplayMetrics();
final int screenWidth = displayMetrics.widthPixels;
final int screenHeight = displayMetrics.heightPixels;
// 4 bytes per pixel
final int screenBytes = screenWidth * screenHeight * 4;
return screenBytes * 3;
}
}
下面是如何實(shí)例化一個(gè) ImageLoader
來使用這個(gè) cache:
RequestQueue mRequestQueue; // assume this exists.
ImageLoader mImageLoader = new ImageLoader(mRequestQueue, new LruBitmapCache(LruBitmapCache.getCacheSize()));
Volley 提供了以下的類用來執(zhí)行 JSON 請(qǐng)求:
JsonArrayRequest
—— 一個(gè)為了獲取給定 URL 的 JSONArray 響應(yīng)正文的請(qǐng)求。JsonObjectRequest
—— 一個(gè)為了獲取給定 URL 的 JSONObject 響應(yīng)正文的請(qǐng)求。允許傳進(jìn)一個(gè)可選的 JSONObject 作為請(qǐng)求正文的一部分。這兩個(gè)類都是基于一個(gè)公共基類 JsonRequest
。我們遵循我們?cè)谄渌?qǐng)求類型使用的同樣的基本模式來使用這些類。如下演示了如果獲取一個(gè) JSON feed 并顯示到 UI 上:
TextView mTxtDisplay;
ImageView mImageView;
mTxtDisplay = (TextView) findViewById(R.id.txtDisplay);
String url = "http://my-json-feed";
JsonObjectRequest jsObjRequest = new JsonObjectRequest
(Request.Method.GET, url, null, new Response.Listener() {
@Override
public void onResponse(JSONObject response) {
mTxtDisplay.setText("Response: " + response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
}
});
// Access the RequestQueue through your singleton class.
MySingleton.getInstance(this).addToRequestQueue(jsObjRequest);
關(guān)于基于 Gson 實(shí)現(xiàn)一個(gè)自定義的 JSON 請(qǐng)求對(duì)象,請(qǐng)參考下一節(jié)課:實(shí)現(xiàn)一個(gè)自定義的請(qǐng)求。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: