创建一个标准的请求

这一节描述了如何使用Volley支持的通用的请求类型:

  • StringRequest。指定一个URL并在响应中接收一个原始字符串。请参考建立一个RequestQueue一节中的例子。
  • ImageRequest。指定一个URL并在响应中接收一幅图片。
  • JsonObjectRequest和JsonArrayRequest (都是JsonRequest的子类)。指定一个URL并在响应中获得一个JSON对象或对象数组(分别地)。

如果你想要的响应是这些类型中的一个,你可能不一定要实现一个定制的请求。这一节描述了如何使用这些便准的请求类型。更多关于如何实现你自己的定制的请求的信息,请参考实现一个定制的请求

请求一幅图片

Volley提供了如下的一些类来请求图片。这些类layer on top of each other来为处理图像提供不同层面的支持:

  • ImageRequest—一个用于获取在一个给定的URL位置处的一幅图像的封装的请求,并会以解码后的bitmap来回调。它也提供了一些方便的功能,比如指定一个size来resize等。它的主要的优点是Volley的线程调度确保昂贵的图像操作(解码,resizing)会自动的在一个worker线程中执行。
  • ImageLoader—一个helper类,用于处理加载和缓存来自于远端URLs的图像。对于大量的ImageRequests来说,ImageLoader是一个管弦乐编曲家,比如当把多个缩略图放进一个ListView中时。ImageLoader在普通的Volley缓存之前提供了一个in-memory 缓存,这对于避免闪烁非常重要。这使得它能够在不阻塞或推迟主线程的情况下,而实现一个缓存命中,而这一点在使用disk I/O时是做不到的。ImageLoader也做了一些响应合并,如果没有它则几乎每一个响应的handler将在一个view上设置一个bitmap,并将导致每一个图像一次layout。合并使得并发地传递多个响应成为了可能,这将提升性能。
  • NetworkImageView—建筑于ImageLoader之上,对于你的图像是通过URL获取自网络的情形,可以用它有效地替换掉ImageView。如果view被从hierarchy中detached掉了的话,NetworkImageView也会管理取消pending requests。

使用ImageRequest

这里是使用ImageRequest的一个例子。它提取由URL描述的图像并把它显示在app中。注意这个代码片段通过一个单例的类来与RequestQueue交互(请参考建立一个RequestQueue来获取关于这个主题的更多讨论):

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

你可以使用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中放置图片的话,NetworkImageView可以为你完成这些。比如:
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);

上面的代码片段通过一个单例的类来访问RequestQueue和ImageLoader,如建立一个RequestQueue一节中所描述的那样。这种方法确保你的app创建了单个的并在你的app整个生命周期中持续的这些类的实例。这一点对于ImageLoader(处理加载和缓存图片的helper类)很重要的理由是in-memory缓存的主要功能就是允许无闪烁的旋转。使用一个单例模式允许bitmap缓存在activity生命周期之外存在。如果在一个activity中创建ImageLoader,则每次用户旋转设备时,ImageLoader将随着activity一起被重新创建。这将导致闪烁。

LRU缓存的例子

Volley toolbox通过DiskBasedCache类提供了一个标准的缓存实现。这个类直接把缓存文件放在硬盘上一个指定的目录中。但要使用ImageLoader,你应该提供一个定制的实现了ImageLoader.ImageCache接口的in-memory LRU bitmap缓存。你可能想要把你的cache建立为一个单例;更多关于这个主题的讨论,请参考建立一个RequestQueue

这里是一个in-memory LruBitmapCache类的示例实现。它扩展了LruCache并实现了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;
    }
}
这里是一个如何实例化一个ImageLoader以使用这个cache的例子:
RequestQueue mRequestQueue; // assume this exists.
ImageLoader mImageLoader = new ImageLoader(mRequestQueue, new LruBitmapCache(
            LruBitmapCache.getCacheSize()));

请求JSON

Volley为JSON请求提供了下列的类:

  • JsonArrayRequest—一个用于提取在一个给定的URL处的JSONArray响应的request。
  • JsonObjectRequest—一个用于提取在一个给定的URL处的JSONObject响应的request,允许传入一个可选的JSONObject作为request的一部分。

这两个类都是基于通用的基类JsonRequest。你可以与使用其它类型的请求相同的基本模式使用它们。比如,这个代码片段获取一个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);

基于Gson实现的一个定制的JSON请求的例子,请参考下一节,实现一个定制的请求

译自:http://developer.android.com/training/volley/request.html

Done.

你可能感兴趣的:(创建一个标准的请求)