继第二篇之后,再来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使用指南第二回

 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<Bitmap>() {
@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);

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

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

但是如果你只要加载一张网络图片,可以使用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);

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

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

第二步:LRU缓存的例子。

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

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

这里是一个实现内存缓存的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;
}
}

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

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

第三步:请求JSON数据

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

作为请求条件。

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

 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<JSONObject>() { @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请求,请看Volley使用指南第四回。

Volley使用指南第三回(来自developer.android)的更多相关文章

  1. Volley使用指南第一回(来自developer.android)

    最近闲来想看看android网络方面的东西.google在2013年发布了一个叫做Volley的网络请求框架,我看了一下官网,居然在training里面就有教程.首先,英文的东西看着 还是挺不爽的,特 ...

  2. Volley使用指南第二回(来自developer.android)

    上一篇文章翻译了一下google的Volley官方文档,讲到了最基本的发送request.这一次我们来下一回:创建一个自定义RequestQueue. 这篇文章将会教你一步一步创建自己的Request ...

  3. Volley使用指南第四回(来自developer.android)

    Volley网络请求的第四篇,废话不多说,开始. 这一篇文章将会教你怎样在Volley支持的范围内定制一个请求. 第一步:写一个通用请求: 大多数请求都有已经写好的接口供你调用,如果你的请求是Stri ...

  4. Android开发-API指南-任务和回退栈

    Task and Back Stack 英文原文: http://developer.android.com/guide/components/tasks-and-back-stack.html 采集 ...

  5. [翻译]现代java开发指南 第三部分

    现代java开发指南 第三部分 第三部分:Web开发 第一部分,第二部分,第三部分 =========================== 欢迎来到现代 Java 开发指南第三部分.在第一部分中,我们 ...

  6. Redis 小白指南(三)- 事务、过期、消息通知、管道和优化内存空间

    Redis 小白指南(三)- 事务.过期.消息通知.管道和优化内存空间 简介 <Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍> 讲的是 Redis 的介绍,以及如何 ...

  7. 世界最大BT服务器本周死了三回 海盗湾要凉凉?

    想當初,我是受到BT網站海盜灣的啟發,開發了一個DHT下載網站:http://www.ibmid.com,有一段時間通宵編程,理解此個協議. 海盗湾(The Pirate Bay)是世界上最大的 BT ...

  8. PADSPCB权威指南-第三章 预处理(部分)(原创)

    PADSPCB权威指南-第三章(部分)豆丁地址:http://www.docin.com/p-707132066.html

  9. 缓存篇(Cache)~第三回 HttpModule实现网页的文件级缓存

    返回目录 再写完缓存篇第一回之后,得到了很多朋友的好评和来信,所以,决定加快步伐,尽快把剩下的文章写完,本篇是第三回,主要介绍使用HttpModule实现的文件级缓存,在看本文之前,大家需要限度Htt ...

随机推荐

  1. [转] Jquery滚动加载

    原文地址:http://hi.baidu.com/vipxiaofan/item/9eb927b795671f77254b0985 另外一个asp.net的例子:http://blog.csdn.ne ...

  2. UVALive 4287 Proving Equivalences(缩点)

    等价性问题,给出的样例为 a->b的形式,问要实现全部等价(即任意两个可以互相推出),至少要加多少个形如 a->b的条件. 容易想到用强连通缩点,把已经实现等价的子图缩掉,最后剩余DAG. ...

  3. mk文件剖析

    一个Android.mk file用来向编译系统描述你的源代码.具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次.你可以在每一个Android.mk file中定义一个 ...

  4. Java [Leetcode 169]Majority Element

    题目描述: Given an array of size n, find the majority element. The majority element is the element that ...

  5. 众神看过来:IE11下鼠标中键(滚轮)导致的一个似乎无法解决的问题?!

    最近在做asp.net mvc项目时遇到一个关于超链接的问题.很是纠结. 问题描述 有一个公司列表展示页.在用鼠标中键(注意了是滚轮)以下简称中键,点击编辑(超链接)的时候在该条数据的下面直接加在一个 ...

  6. mkswap 把一个分区格式化成为swap交换区

    mkswap /dev/sda* //创建此分区为swap 交换分区swapon /dev/sda* //加载交换分区swapoff /dev/sda* //关闭交换分区: 若想要开机自动挂载:vi ...

  7. GitHub托管

    借助GitHub托管你的项目代码   PS:话说自己注册了GitHub都很久了,却没有怎么去弄,现在系统学习一下,也把自己的学习经历总结下来share给大家,希望大家都能把GitHub用起来,把你的项 ...

  8. IDEA与Tomcat创建并运行Java Web项目及servlet的简单实现

    创建Web项目 1. File -> New Project ,进入创建项目窗口 2.在 WEB-INF 目录下点击右键, New -> Directory ,创建  classes 和  ...

  9. <转>Python 多线程的单cpu与cpu上的多线程的区别

    你对Python 多线程有所了解的话.那么你对python 多线程在单cpu意义上的多线程与多cpu上的多线程有着本质的区别,如果你对Python 多线程的相关知识想有更多的了解,你就可以浏览我们的文 ...

  10. 022 UFT虚拟对象

    虚拟对象: 程序中那些行为标准类型对象的对象,但不能被QTP识别,则可把这些对象类型称为虚拟对象.并且映射到某类标准对象,例如button,check box等,QTP在测试过程中就会对这些虚拟对象模 ...