volley
下载导入volleyjar
学习地址: https://blog.csdn.net/guolin_blog/article/details/17482095
2013在Google I/O大会提出
github地址: https://github.com/google/volley
下载volley导入到as
具体的操作是: project模式下 具体看图:
之后的操作是打开lib 选择jar 右击:
add as libiray
其他方式导入的,看以前的博客记录.
三部曲
创建RequestQueue
创建方法有三种,后面说,我们看简答使用.
第二部: new StringRequest(参数1,2,3);
as的直接使用ctrl p查看需要的参数,我们先不管 int method;
我们使用的参数分别是: 目标地址 成功的response的回调和失败的回调.
我们使用的如下:
// 第二部创建一个request
StringRequest StringRequest = new StringRequest(“http://www.baidu.com”, new Response.Listener() {
@Override
public void onResponse(String s) {
// 日志打印
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
//日志打印
}
});
注意的是: StringRequest是volley包里面的,内部继承的Request类;
第三部,将创建的 StringRequest添加到RequestQueue里面.
mRequestQueue.add(StringRequest);
开始运行,查看log
我们看看log; 此时的操作是 需要url的http后面添加s;
再次运行就ok了,
StringRequest stringRequest = new StringRequest(Method.POST, url, listener, errorListener);
StringRequest还有提供四个参数的方法,来指定请求的类型.
具体如下:
super.getParams()指向的是Request的getParams方法
最后的结果是:
//参数的 stringRequest
StringRequest stringRequest1 = new StringRequest(Request.Method.POST,"url地址",
new Response.Listener<String>() {
@Override
public void onResponse(String s) {
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> maps= new HashMap<String, String>();
maps.put("key","value");
// 放置需要的参数
return maps;
}
};
学习使用 JsonRequest
直接复制郭霖的文字:
JsonRequest也是继承自Request类的,不过由于JsonRequest是一个抽象类,因此我们无法直接创建它的实例,那么只能从它的子类入手了。JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest,从名字上你应该能就看出它们的区别了吧?一个是用于请求一段JSON数据的,一个是用于请求一段JSON数组的。
访问的地址: http://www.weather.com.cn/weather1d/101010100.shtml
郭霖的地址使用不了.我们使用下面的地址来替换.http://www.weather.com.cn/data/sk/101010100.html
最后使用的url: http://www.weather.com.cn/data/sk/101010100.html
JsonObjectRequest jsonObjectRequest =
new JsonObjectRequest("http://www.weather.com.cn/data/sk/101010100.html", null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
Log.d("天气response", jsonObject.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.e("天气返回",
volleyError.getMessage(), volleyError);
}
});
mRequestQueue.add(jsonObjectRequest);
打印日志如下:
使用ImageRequest
代码:
`// 使用 ImageRequest
ImageRequest imageRequest = new ImageRequest(
"https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg"
, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
mVolley_im.setImageBitmap(bitmap);
}
}, 0, 0, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
// 失败设置展示默认的图片
}
});
//添加
mRequestQueue.add(imageRequest);`
注意获取imageview控件哦.
参数的说明:
直接复制吧:
ImageRequest的构造函数接收六个参数,第一个参数就是图片的URL地址,这个没什么需要解释的。第二个参数是图片请求成功的回调,这里我们把返回的Bitmap参数设置到ImageView中。第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。第五个参数用于指定图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小。第六个参数是图片请求失败的回调,这里我们当请求失败时在ImageView中显示一张默认图片
使用imageloader和imagerequest来实现图片加载
直接代码说明:
/*使用ImageLoad
步骤如下1. 创建一个RequestQueue对象。 我们已经创建完成
2. 创建一个ImageLoader对象。
3. 获取一个ImageListener对象。
4. 调用ImageLoader的get()方法加载网络上的图片。*/
//创建ImageLoader参数: RequestQueue 和ImageCache 后续使用Bitmapcache替换
/*ImageLoader imageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() {
@Override
public Bitmap getBitmap(String s) {
return null;
}
@Override
public void putBitmap(String s, Bitmap bitmap) {
}
});*/
//上面的代码可以使用下面代码替换,BitmapChae实现ImageCache,做了图片缓存使用LruCache
ImageLoader imageLoader= new ImageLoader(mRequestQueue,new BitmapCache());
// 使用ImageLoader来获取一个ImageListener 第一参数控件 默认图片和 错误的时候设置的图片
ImageLoader.ImageListener imageListener = ImageLoader.getImageListener(mVolley_im,
R.mipmap.ic_launcher, R.mipmap.ic_launcher);
mUrl = "https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg";
imageLoader.get(mUrl
,imageListener);
imageLoader.get(mUrl,imageListener,200,200);
附上BitmapCache的完整代码:
import android.graphics.Bitmap;
import android.util.LruCache;
import com.android.volley.toolbox.ImageLoader;
public class BitmapCache implements ImageLoader.ImageCache {
private final int maxSize = 10 * 1024 * 1024;
private final LruCache<String, Bitmap> mLruCache;
public BitmapCache() {
mLruCache = new LruCache<String, Bitmap>(maxSize) {
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String s) {
return mLruCache.get(s);
}
@Override
public void putBitmap(String s, Bitmap bitmap) {
mLruCache.put(s, bitmap);
}
}
NetworkImageView
Volley还提供了第三种方式来加载网络图片;
-
创建一个RequestQueue对象。
-
创建一个ImageLoader对象。
-
在布局文件中添加一个NetworkImageView控件。
-
在代码中获取该控件的实例。
-
设置要加载的图片地址。
代码实现:
` /*networkImageview的实现*/
mImageLoader1 = new ImageLoader(mRequestQueue, new BitmapCache());
mvolley_network_im.setImageUrl(mUrl,mImageLoader1);
mvolley_network_im.setDefaultImageResId(R.mipmap.ic_launcher);
mvolley_network_im.setErrorImageResId(R.drawable.img_btn_add);`
XmlRequest实现
地址: http://flash.weather.com.cn/wmaps/xml/china.xml
代码实现:
// 解析xml
String xmlurl="http://flash.weather.com.cn/wmaps/xml/china.xml";
XmlRequest xmlRequest = new XmlRequest(xmlurl, new Response.Listener<XmlPullParser>() {
@Override
public void onResponse(XmlPullParser response) {
try {
int eventType = response.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_TAG:
String nodeName = response.getName();
if ("city".equals(nodeName)) {
String pName = response.getAttributeValue(0);
Log.d("TAG+省份", "pName is " + pName);
}
break;
}
eventType = response.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.e("xmlrequest错误", volleyError.getMessage(), volleyError);
}
});
mRequestQueue.add(xmlRequest);
xmlRequest如下:
public class XmlRequest extends Request<XmlPullParser> {
private final Response.Listener<XmlPullParser> mListener;
public XmlRequest(int method, String url, Response.Listener<XmlPullParser> listener,
Response.ErrorListener errorListener) {
super(method, url, errorListener);
mListener = listener;
}
public XmlRequest(String url, Response.Listener<XmlPullParser> listener, Response.ErrorListener errorListener) {
this(Method.GET, url, listener, errorListener);
}
@Override
protected Response<XmlPullParser> parseNetworkResponse(NetworkResponse response) {
try {
String xmlString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlString));
return Response.success(xmlPullParser, HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (XmlPullParserException e) {
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(XmlPullParser response) {
mListener.onResponse(response);
}
}
GsonRequest
直接代码吧!里面有详细的说明,我们依赖直接as依赖,不在下载jar包,创建类,我们直接使用快捷键来生成,gsonformat alt+insert
不在使用文章中的weather,直接使用生成的gsonbean来替换哈!
GsonRequest 的创建和实现:
public class GsonRequest<T> extends Request<T> {
// 创建一个listener
private Response.Listener mListener;
private Class<T> mClazz;
private Gson mGson;
public GsonRequest(String url, Class<T> clazz, Response.Listener<T>listener,Response.ErrorListener errlistener) {
this(Method.GET,url,clazz,listener,errlistener);
}
public GsonRequest(int method, String url, Class<T> clazz, Response.Listener<T>listener,Response.ErrorListener errlistener) {
super(method, url, errlistener);
/*为啥在这里里面创建
*
* 默认的是get也会走这个构造方法, 注意this 和这里面的super,最后的url和method等都传给Request了.
* */
// 创建gson
mGson = new Gson();
// 成员变量 保存成功的listener和clazz
mListener=listener;
mClazz=clazz;
}
@Override
protected Response<T> parseNetworkResponse(NetworkResponse networkResponse) {
// 进行解析
try {
String s = new String(networkResponse.data,
HttpHeaderParser.parseCharset(networkResponse.headers));
return Response.success(mGson.fromJson(s,mClazz),
HttpHeaderParser.parseCacheHeaders(networkResponse));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(T t) {
mListener.onResponse(t);
}
}
weatherinfo,直接自己生成吧!根据json字符串,url地址: http://www.weather.com.cn/data/sk/101010100.html
/*gsonRequest的使用
* 第一步: 依赖gson 我们直接as导入 github地址: https://github.com/google/gson
* implementation 'com.google.code.gson:gson:2.8.5'
*
* 第二部:实现一个GsonRequest 继承 Request
*
* 创建gson创建weatherInfo
*
* 创建GsonRequest
* 添加到Request中
* * */
String gsonURL ="http://www.weather.com.cn/data/sk/101010100.html";
GsonRequest<WeatherInfo> weatherInfoGsonRequest = new GsonRequest<>(gsonURL, WeatherInfo.class, new Response.Listener<WeatherInfo>() {
@Override
public void onResponse(WeatherInfo weatherInfo) {
String city = weatherInfo.getWeatherinfo().getCity();
String temp = weatherInfo.getWeatherinfo().getTemp();
String time = weatherInfo.getWeatherinfo().getTime();
Log.d("gson天气查询", city + "temp==>" + temp + "time==>" + time);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.d("gson天气查询", volleyError.getMessage(), volleyError);
}
});
mRequestQueue.add(weatherInfoGsonRequest);
别忘记添加到RequestQueue中.
打印日志:
我们从打印日志看到一个是乱码一个好着呢,这个解决方法就是在我们创建的GsonRequest里面
我们查看源码可知:
日志打印:
看到问题所在没有,最后在new String的时候设置了编码格式,我们不用了,直接修改为"utf-8"
修改展示:
volley的使用就算完成了,跟随郭霖的volley学习前三篇都做完了!,之后就是volley的源码分析,单独写写一篇 .