这一节描述了如何使用Volley支持的通用的请求类型:
如果你想要的响应是这些类型中的一个,你可能不一定要实现一个定制的请求。这一节描述了如何使用这些便准的请求类型。更多关于如何实现你自己的定制的请求的信息,请参考实现一个定制的请求。
Volley提供了如下的一些类来请求图片。这些类layer on top of each other来为处理图像提供不同层面的支持:
这里是使用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来高效地协调管理多幅图片的显示,比如在一个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一起被重新创建。这将导致闪烁。
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()));
Volley为JSON请求提供了下列的类:
这两个类都是基于通用的基类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.