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;

“https://www.baidu.com”

再次运行就ok了,

StringRequest stringRequest = new StringRequest(Method.POST, url, listener, errorListener);

StringRequest还有提供四个参数的方法,来指定请求的类型.

具体如下:

super.getParams()指向的是Request的getParams方法

最后的结果是:

 //参数的 stringRequestStringRequest stringRequest1 = new StringRequest(Request.Method.POST,"url地址",new Response.Listener<String>() {@Overridepublic void onResponse(String s) {}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError volleyError) {}}){@Overrideprotected 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>() {@Overridepublic void onResponse(JSONObject jsonObject) {Log.d("天气response", jsonObject.toString());}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError volleyError) {Log.e("天气返回",volleyError.getMessage(), volleyError);}});mRequestQueue.add(jsonObjectRequest);

打印日志如下:

使用ImageRequest

代码:

`//  使用 ImageRequestImageRequest imageRequest = new ImageRequest("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", new Response.Listener<Bitmap>() {@Overridepublic void onResponse(Bitmap bitmap) {mVolley_im.setImageBitmap(bitmap);}}, 0, 0, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {@Overridepublic 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() {@Overridepublic Bitmap getBitmap(String s) {return null;}@Overridepublic void putBitmap(String s, Bitmap bitmap) {}});*///上面的代码可以使用下面代码替换,BitmapChae实现ImageCache,做了图片缓存使用LruCacheImageLoader 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) {@Overrideprotected 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还提供了第三种方式来加载网络图片;

  1. 创建一个RequestQueue对象。

  2. 创建一个ImageLoader对象。

  3. 在布局文件中添加一个NetworkImageView控件。

  4. 在代码中获取该控件的实例。

  5. 设置要加载的图片地址。

代码实现:

 ` /*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

代码实现:

  // 解析xmlString xmlurl="http://flash.weather.com.cn/wmaps/xml/china.xml";XmlRequest xmlRequest = new XmlRequest(xmlurl, new Response.Listener<XmlPullParser>() {@Overridepublic 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() {@Overridepublic 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了.* */// 创建gsonmGson = new Gson();// 成员变量 保存成功的listener和clazzmListener=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>() {@Overridepublic 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() {@Overridepublic void onErrorResponse(VolleyError volleyError) {Log.d("gson天气查询", volleyError.getMessage(), volleyError);}});
mRequestQueue.add(weatherInfoGsonRequest);

别忘记添加到RequestQueue中.

打印日志:

我们从打印日志看到一个是乱码一个好着呢,这个解决方法就是在我们创建的GsonRequest里面

我们查看源码可知:

日志打印:

看到问题所在没有,最后在new String的时候设置了编码格式,我们不用了,直接修改为"utf-8"

修改展示:

volley的使用就算完成了,跟随郭霖的volley学习前三篇都做完了!,之后就是volley的源码分析,单独写写一篇 .

跟随郭霖学Volley相关推荐

  1. 专访郭霖:成长无止境

    留意文末赠书活动 嘉宾 | 郭霖 文 | 张霞 郭霖,Android开发工程师,Android GDE(Google认证开发者专家).从事Android开发工作9年,有着丰富的项目实战经验,负责及参与 ...

  2. 图灵直播|《第一行代码》作者郭霖在线Coding,今晚八点,给你留位!

    图源来自Pexels "我们为什么需要 Kotlin?答:消失的 Getter 和 Setter.又见空指针.Smart Cast.打日志.再见Utils.晚安ButterKnife--&q ...

  3. 一款汇总了郭霖,鸿洋,以及自己平时收集的自定义控件集合库

    MeiWidgetView 项目地址:HpWens/MeiWidgetView  简介:一款汇总了郭霖,鸿洋,以及自己平时收集的自定义控件集合库 更多:作者   提 Bug 标签:     一款汇总了 ...

  4. Android Notification详解【郭霖公众号推荐】

    目录介绍 1.Notification简单概述 2.Notification通知用途 3.Notification的基本操作 3.1 Notification创建必要的属性 3.2 Notificat ...

  5. 《第一行代码》作者郭霖大神安卓问题解答

    列举了几个郭大神解答的有关Android的问题,虽然只有几个问题,但是基本涵盖了各个安卓开发阶段的困惑,郭大神的回答简洁深刻,收获颇丰. 1.工作有点吃力怎么办? 首先你要自信,公司都信任你了,你又何 ...

  6. 撸了郭霖大神写的Framework源码笔记,Android篇

    前言 我们程序员之所以担心35岁被裁员,是因为自己的经验和实力能力不符合,国内IT现状,大多数程序员都在外包公司工作,框架老化,代码就是为了完成任务而写,刚定好需求你做一半产品突然让你改需求--一切的 ...

  7. 升职加薪必看!撸了郭霖大神写的Framework源码笔记,醍醐灌顶!

    前言 2020年,互联网裁员潮下,我度过了人生中最清晰的半年. 今年我本命年,熬过了程序员35的坎,却在36岁被公司破产来了当头一棒,领完了当月份的工资,老板,也是我哥们的老李走进我的办公室,没有迂回 ...

  8. 恭喜郭霖成为GDE(Google开发者专家)!

    GDE的全称是Google Developer Expert,是Google在全球范围内开展的一个开发者专家认证项目.如果你对Google的某个技术领域非常擅长,同时在这个领域有比较高的影响力的话,那 ...

  9. Android LayoutInflater原理分析,带你一步步深入了解View(一) 郭霖学习摘要

    2019独角兽企业重金招聘Python工程师标准>>> public class MainActivity extends Activity {//----------------- ...

  10. android 内存分析 郭霖_android 内存泄漏(OOM)问题总结

    对于Java来说,就是new出来的Object 放在Heap上无法被GC回收 Paste_Image.png Context Context Context类本身是一个纯abstract类,它有两个具 ...

最新文章

  1. xilinx axi dma linux 快速搭建框架
  2. 微信小程序接入腾讯地图sdk地图 用户自选位置。踩坑+代码实现
  3. php $y=$x^$y;,PHP语法一
  4. mips语言实现 f(n) = f(n-1) + 2*f(n-2) + 3*f(n-3)
  5. c# 拼凑特定格式的报表打印
  6. sql server 比较大小
  7. discuz自动添加兼容html5标签的音乐播放器
  8. 基于 Laravel 的模块化开发框架 Notadd RC1 fix1 发布
  9. (转)洪小文:以科学的方式赤裸裸地剖析AI|混沌初开
  10. oracle v rman status,ORACLE xtts + RMAN
  11. 免费查询IP的API
  12. SI446x系列之路--基本操作
  13. IDEA配置Tomcat时总是提示:Error running ‘Tomcat 8.5.73‘ 问题
  14. 用友添加附件设置文件服务器,用友服务器怎么配置上传附件
  15. Android 多种限定符
  16. 第31届国际信息学奥林匹克竞赛真题-2019-
  17. linux设备驱动--字符设备模型
  18. 大学生HTML5竞赛网站,2019全国大学生信息安全竞赛Web Writeup
  19. Gitlab集成odoo单点登录
  20. MathType的下载和安装以及添加到word中

热门文章

  1. Excel 常用技巧目录
  2. 单例模式只会懒汉饿汉?读完本篇让你面试疯狂加分
  3. [2018.11.05 T1] 喝牛奶
  4. python中item是什么意思中文-python中的item
  5. 开环传递函数判断系统类型_已知系统的开环传递函数,试用Nyquist稳定判据判断系统的稳定性。_学小易找答案...
  6. OGG故障集锦(一)
  7. element-ui Form表单验证
  8. 负载均衡器ribbon和LoadBalancer
  9. 分布式定时任务Spring Boot + Quartz实现
  10. 亿格瑞A5-hdmi故障了