• Volley使用指南第三回(来自developer.android)


    继第二篇之后,再来Volley使用的教程的第三篇,有些翻译我是根据自己的理解,可能有错误的地方,还请多多包涵。

    标准请求

    这一回课将会告诉你Volley能够完成的3种请求类型

    1、StringReqeust:请求一个String类型的返回,具体看Volley使用指南第一回

    2、ImageRequest:请求图片。

    3、JsonObjectRequest和JsonArrayRequest (这两个都是JsonRequest的子类):请求在response中返回一个json object类型。

    如果你想要使用其中一种类型,你就不需要使用一种定制类型的请求,那么如果你想要使用一种定制类型的请求,请看Volley使用指南第四回。

    第一步:请求一张图片

    Volley提供了以下几个类来请求一张图片,这些类层之上的相互提供不同层次的支持处理图片。

    1、ImageRequest:一个封装好的请求图片类,只要发送一个url ,然后返回一个解码好的bitmap类型的图片。它还提供了一个非常好用的特性,就是

    重新定义图片大小。好处就是Volley在线程调度确保一些费力的操作(解码, 重新定义大小)操作在工作线程里面自动完成。

    2、ImageLoader: 一个处理加载和缓存远程图片的类。ImageLoader与大量的ImageRequest协调,比如说要请求很多头像放在listview里面,ImageLoader

    在正常cache之前提供了一个内存级别的cache,以防闪烁。这使得它实现访问cache时不会阻塞主线程,这在使用磁盘I/O时是不可能的。ImageLoader还做的

    一个工作就是返回内容聚合,没有他几乎所有的response handler都要处理把bitmap放进view并且帮每个图片进行布局。返回内容聚合使得同时处理多返回成为

    可能,这提高了图片加载的表现。

    3、NetworkImageView:建立在ImageView之上,可以用来加载网络上获取的图片。NetworkImageView还可以处理待发请求的取消操作。

    下面是ImageRequest的栗子,注意使用的是单例模式,见Volley使用指南第二回

     1 ImageView mImageView;
     2 String url = "http://i.imgur.com/7spzG.png";
     3 mImageView = (ImageView) findViewById(R.id.myImage);
     4 ...
     5 
     6 // Retrieves an image specified by the URL, displays it in the UI.
     7 ImageRequest request = new ImageRequest(url,
     8     new Response.Listener<Bitmap>() {
     9         @Override
    10         public void onResponse(Bitmap bitmap) {
    11             mImageView.setImageBitmap(bitmap);
    12         }
    13     }, 0, 0, null,
    14     new Response.ErrorListener() {
    15         public void onErrorResponse(VolleyError error) {
    16             mImageView.setImageResource(R.drawable.image_load_error);
    17         }
    18     });
    19 // Access the RequestQueue through your singleton class.
    20 MySingleton.getInstance(this).addToRequestQueue(request);

    用NetworkImageView加载网络图片,和使用ImageView是一样的:

    1 <com.android.volley.toolbox.NetworkImageView
    2         android:id="@+id/networkImageView"
    3         android:layout_width="150dp"
    4         android:layout_height="170dp"
    5         android:layout_centerHorizontal="true" />

    你还可以使用ImageLoader直接加载图片:

     1 ImageLoader mImageLoader;
     2 ImageView mImageView;
     3 // The URL for the image that is being loaded.
     4 private static final String IMAGE_URL =
     5     "http://developer.android.com/images/training/system-ui.png";
     6 ...
     7 mImageView = (ImageView) findViewById(R.id.regularImageView);
     8 
     9 // Get the ImageLoader through your singleton class.
    10 mImageLoader = MySingleton.getInstance(this).getImageLoader();
    11 mImageLoader.get(IMAGE_URL, ImageLoader.getImageListener(mImageView,
    12          R.drawable.def_image, R.drawable.err_image));

    但是如果你只要加载一张网络图片,可以使用NetworkImageView:

     1 ImageLoader mImageLoader;
     2 NetworkImageView mNetworkImageView;
     3 private static final String IMAGE_URL =
     4     "http://developer.android.com/images/training/system-ui.png";
     5 ...
     6 
     7 // Get the NetworkImageView that will display the image.
     8 mNetworkImageView = (NetworkImageView) findViewById(R.id.networkImageView);
     9 
    10 // Get the ImageLoader through your singleton class.
    11 mImageLoader = MySingleton.getInstance(this).getImageLoader();
    12 
    13 // Set the URL of the image that should be loaded into this view, and
    14 // specify the ImageLoader that will be used to make the request.
    15 mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader);

    上面的代码通过sigleton类获取RequestQueue 和 ImageLoader,这种方法可以确保你在应用程序的生命周期内创建这些单例。这个对于ImageLoader来说是很重要的,

    在内存中进行缓存的目的是无闪烁转动(横屏)。使用单例模式的好处是你不用再手机横屏等操作后重新创建ImageLoader时出现屏幕闪烁问题。

    第二步:LRU缓存的例子。

    在Volley toolbox里面有提供了一个标准的DiskBasedCache接口,这个类做的事情是把数据缓存在磁盘的特定目录下面。但要使用ImageLoader,你需要提供一个内存级别

    继承ImageLoader.ImageCache的LRU bitmap缓存。如果你希望创建一个单例的缓存机制,请看Volley使用指南第二回。

    这里是一个实现内存缓存的LruBitmapCache类。它扩展了LruCache类并实现了ImageLoader.ImageCache接口:

     1 import android.graphics.Bitmap;
     2 import android.support.v4.util.LruCache;
     3 import android.util.DisplayMetrics;
     4 import com.android.volley.toolbox.ImageLoader.ImageCache;
     5 
     6 public class LruBitmapCache extends LruCache<String, Bitmap>
     7         implements ImageCache {
     8 
     9     public LruBitmapCache(int maxSize) {
    10         super(maxSize);
    11     }
    12 
    13     public LruBitmapCache(Context ctx) {
    14         this(getCacheSize(ctx));
    15     }
    16 
    17     @Override
    18     protected int sizeOf(String key, Bitmap value) {
    19         return value.getRowBytes() * value.getHeight();
    20     }
    21 
    22     @Override
    23     public Bitmap getBitmap(String url) {
    24         return get(url);
    25     }
    26 
    27     @Override
    28     public void putBitmap(String url, Bitmap bitmap) {
    29         put(url, bitmap);
    30     }
    31 
    32     // Returns a cache size equal to approximately three screens worth of images.
    33     public static int getCacheSize(Context ctx) {
    34         final DisplayMetrics displayMetrics = ctx.getResources().
    35                 getDisplayMetrics();
    36         final int screenWidth = displayMetrics.widthPixels;
    37         final int screenHeight = displayMetrics.heightPixels;
    38         // 4 bytes per pixel
    39         final int screenBytes = screenWidth * screenHeight * 4;
    40 
    41         return screenBytes * 3;
    42     }
    43 }

    下面是使用这个cache实例化ImageLoader的例子:

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

    第三步:请求JSON数据

    Volley为请求JSON数据提供了两个类:JsonArrayRequest请求返回一个JsonArray数据、JsonObjectRequest请求返回一个JsonObject数据。请求体中允许带JsonObject

    作为请求条件。

    这两个类都是JsonRequest的子类。你可以像其他请求模式一样请求json,下面这段代码请求一个json数据并填充在text中。

     1 TextView mTxtDisplay;
     2 ImageView mImageView;
     3 mTxtDisplay = (TextView) findViewById(R.id.txtDisplay);
     4 String url = "http://my-json-feed";
     5 
     6 JsonObjectRequest jsObjRequest = new JsonObjectRequest
     7         (Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
     8 
     9     @Override
    10     public void onResponse(JSONObject response) {
    11         mTxtDisplay.setText("Response: " + response.toString());
    12     }
    13 }, new Response.ErrorListener() {
    14 
    15     @Override
    16     public void onErrorResponse(VolleyError error) {
    17         // TODO Auto-generated method stub
    18 
    19     }
    20 });
    21 
    22 // Access the RequestQueue through your singleton class.
    23 MySingleton.getInstance(this).addToRequestQueue(jsObjRequest);

    要在Gson的基础上定制json请求,请看Volley使用指南第四回。

  • 相关阅读:
    Hadoop 组成
    umlの活动图
    一种基于ES5的JavaScript继承
    Unity3.x游戏开发经典教程 书例 100%完毕~
    AndroidMainifest标签使用说明1——&lt;action&gt;
    JS图片自己主动轮换效果实现
    现有一些开源ESB总线的比較
    安装程序不能验证Update.inf文件的完整性,请确定加密服务正在此计算机上执行
    leetCode解题报告5道题(九)
    浅谈C++多态性
  • 原文地址:https://www.cnblogs.com/lout/p/4888136.html
Copyright © 2020-2023  润新知