Android網絡通信工具Volley

jopen 11年前發布 | 19K 次閱讀 Android Android開發 移動開發

請求一個Image

Volley 提供了一下classes 來幫助開發者請求server上的圖片。這些類提供的不同的level來處理圖片

  • ImageRequest:通過一個圖片url可以獲取一張bitmap,這個類提供了方便的特性比如說改變圖片的大小。他的主要好處事通過Volley的線程schedule老確保圖片的編碼和調整大小

  • ImageLoader:可以通過URL獲取大量的圖片。比如要將大量的縮略圖放在一個ListView中。ImageLoader提供了一個內存級別的緩存機制,這個就防止了圖片的閃爍。同時,ImageLoader還提供了聚合的response,可以同時返回多個response,從而提高了性能。

  • NetworkImageView:建立在ImageLoader之上,在獲取遠程圖片的時候可以完全的取代Imageview。


使用ImageRequest

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);
    }
});

記得通過一個單類將請求天劍到RequestQueue。

使用ImageLoader和NetworkImageView

可以使用ImageLoader和Network這個對組合來展示多副圖片,在xml文件中可以這么寫

<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));

當然也可以將他們兩個結合起來使用。

那個為什么要使用單類模式呢。可以參考:

This approach ensures that your app creates single instances of these classes that last the lifetime of your app. The reason that this is important for ImageLoader (the helper class that handles loading and caching images) is that the main function of the in-memory cache is to allow for flickerless rotation. Using a singleton pattern allows the bitmap cache to outlive the activity. If instead you create the ImageLoader in an activity, the ImageLoader would be recreated along with the activity every time the user rotates the device. This would cause flickering.

一個LRU緩存的例子

Volley提供了一個標準的緩存實現通過DiskBasedCache這個類。這個類樂意直接緩存圖片到磁盤文件中的一個具體的目錄下面。 但是當你使用ImageLoader的是時候你應該實現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;
}
}

這個是ImageLoader使用那個緩存

RequestQueue mRequestQueue; // assume this exists.
ImageLoader mImageLoader = new ImageLoader(mRequestQueue, new LruBitmapCache(
        LruBitmapCache.getCacheSize()));

請求一個JSON

類說明:

  • JsonArrayRequest:根據URL返回的是一個JsonArray
  • JsonObjectRequest:可以返回一個JsonObject,同時允許將一個JsonObject傳激怒去作為請求的body(通過Gson)
  • </ul>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!