跟随郭霖学Volley

article/2025/9/17 8:21:42

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的源码分析,单独写写一篇 .


http://chatgpt.dhexx.cn/article/rL8RtcOj.shtml

相关文章

android 6.0权限 郭霖,Permission——郭霖认为最优的运行时权限方案

Android6.0发布这么久&#xff0c;对运行时权限也看了很多资料&#xff0c;对比过几个流行的库。但是个人还是喜欢在项目里用自己动手封装的东西&#xff0c;哪怕照抄也好。。。不知道是什么原因。 前天无意听郭神的直播。讲解的是运行时权限的封装&#xff0c;收益颇多。依样画…

郭霖LitePal

由于项目需要开始学习sqlite 一开始先学习使用的是 android ormlite 操作 从最基本的建表增删改查一路走来 磕磕碰碰很多 都是在内存中操作sqlite 只能通过sqlitestudio工具进行查看 不能导出 并且应用卸载数据表就丢失 最终考虑在sd卡中操作sqlite 但是ormlite 并没有这方面…

android郭霖博客,Runtime Permissions(郭霖CSDN公开课)

运行时权限 Api23开始&#xff0c;Android权限机制更改&#xff0c;有一部分权限不再是简单的在AndroidManifest.xml中声明即可。而是需要在运行时让用户去选择是否允许该项权限的操作。 那么哪些权限需要在运行时申请呢&#xff1f;危险权限需要这么做&#xff0c;而普通权限仍…

看一看Facebook工程师是怎么评价《第一行代码》的

本文同步发表于我的微信公众号&#xff0c;扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注&#xff0c;每个工作日都有文章更新。 大家好&#xff0c;我是一名Facebook的工程师&#xff0c;同时也是《第一行代码——Android》的忠实读者。 虽然我最近几年是在国外读书和工…

郭霖:手把手教你实现 App 360 度旋转看车效果

这是郭神号前阵子的推送&#xff0c;应该有不少人还没有看过&#xff0c;现在分享给大家&#xff0c;希望对大家的Android工作和学习有所帮助。 / 作者简介 / 本篇文章来自Youth Lee的投稿&#xff0c;分享了他自己结合Glide写的一个控件&#xff0c;希望对大家有所帮助&#…

第一行代码-第二版(郭霖著)笔记(初识Android)

系列文章目录 第一章 第一行代码-第二版&#xff08;郭霖著&#xff09;笔记&#xff08;初识Android&#xff09; 目录 一、Android简介 1.android系统架构 2.Android应用开发特色 二、工具准备 Tips:新建项目的时候是否勾选use legacy android.support libraries 三、…

专访郭霖:成长无止境

留意文末赠书活动 嘉宾 | 郭霖 文 | 张霞 郭霖&#xff0c;Android开发工程师&#xff0c;Android GDE&#xff08;Google认证开发者专家&#xff09;。从事Android开发工作9年&#xff0c;有着丰富的项目实战经验&#xff0c;负责及参与开发过多款移动应用与游戏&#xff0c;开…

解决http响应状态为canceled

最近写登录的页面&#xff0c;发现通过ajax请求后台的时候&#xff0c;监控台返回该请求的状态是canceled。 原因 仅仅是由于之前为了在输入账号时让浏览器进行自动补全&#xff0c;而将原先的div更换为了form,而不巧的是之前的登录事件源使用的是button。 而至于为什么stat…

ajax请求导致status为canceled的原因

在使用layui的form表单提交以后&#xff0c;请求状态总是canceled。后来在form表单的后面添加了一行代码&#xff1a; return false; 就可以了。 文档&#xff1a;https://www.layui.com/doc/modules/form.html#onsubmit 错误&#xff1a; 解决方法&#xff1a; 总结一下&…

ajax请求文件状态为 canceled 的解决办法

ajax请求文件状态为 canceled 的解决办法 场景还原原因分析解决 场景还原 最近做一个表单提交的需求时&#xff0c;遇到了这种情况&#xff0c;输完账号密码后回车提交&#xff0c;报错&#xff0c;f12打开看到是请求的status为canceled了&#xff0c;震惊一秒钟。。。如下图&…

chrome同步或登录报错:Request Canceled

原因 因为某个接口连接失败造成&#xff0c;可以摁快捷键F12或者点击开发者工具。 然后选择network&#xff0c;这里面是该页面所有的收发请求 开始登录&#xff0c;登录的时候要注意network中pending或者报错的接口&#xff0c;然后把域名记录下来 解决方式 安装chrome插…

http发送请求,status显示canceled的原因

原因&#xff1a;onSubmit和submit属性比较陈旧&#xff0c;在提交了数据以后会自动刷新页面&#xff0c;导致信息丢失以及请求中止 解决&#xff1a;在 handler里面写入e.preventDefault();阻止onsubmit执行默认的刷新页面行为。

使用 npm create vue@3 报错 npm ERR! canceled

问题 之前运行都可以成功创建&#xff0c;但今天运行 npm create vue3 的时候报错了&#xff0c;错误信息如下&#xff1a; 解决方法 在网上找了一堆方法都无效。 npm 版本问题&#xff0c;升级到最新版本 npm i -g npm&#xff0c;然后重试 npm create vue3 【x】npm cac…

Go:read一个已经被canceled的http.Request的应答

Go&#xff1a;read一个已经被canceled的http.Request的应答 1.复现 最近发现项目在处理chunk类型的http应答时&#xff0c;出现读数据异常报错&#xff0c;代码示例如下&#xff1a; server package mainimport ("bytes""net/http" )func main() {http…

Idea通过git拉取代码的时候出现Update canceled问题

当在IDEA中通过Git更新代码时&#xff0c;拉取失败&#xff0c;报如下错误 12:31 Update failedInvocation failed Server returned invalid Response.java.lang.RuntimeException: Invocation failed Server returned invalid Response.at git4idea.GitAppUtil.sendXmlRequest…

Xmodem operation was canceled by remote peer问题已解决

1.Xmodem operation was canceled by remote peer. 传输的时候就会出现注意的问题 2.使用df -h命令查看内存状况&#xff0c;可以发现root已经满了。 3.进入根目录&#xff0c;ls显示&#xff0c;使用rm命名将其中的文件删除 4.显示&#xff0c;可以看见内存占用变少。 5.…

vue proxy发出的post请求出现超时导致的canceled

0 问题 vue的proxy代理好了之后&#xff0c;get请求没问题&#xff0c;post请求出现canceled&#xff0c;如下图所示&#xff1a; 解决方案 参考 https://github.com/chimurai/http-proxy-middleware/issues/40 devServer: {host: 0.0.0.0,port: 8085,proxy: {/api: {targ…

IDEA中git拉取代码的时出现Update canceled问题

IDEA中git拉取代码的时出现Update canceled问题 当在IDEA中通过Git更新代码时&#xff0c;拉取失败&#xff0c;报如下错误 解决办法&#xff1a; 勾选上以后&#xff0c;点击 OK 后拉取代码&#xff1b; 然后就成功了

解决Canceled future for execute_request message before replies were done

报错&#xff1a;Canceled future for execute_request message before replies were done The Kernel crashed while execut 解决办法&#xff0c;在代码中添加 import os os.environ["KMP_DUPLICATE_LIB_OK"]"TRUE"就完美解决了

ajax请求取消状态,Ajax请求响应状态status为canceled

需求:业务数据提交成功之后,根据表单 ‘项目阶段’ 字段的值发送邮件; 我的实现逻辑是这样的:在业务数据提交成功后的回掉函数中发起发送邮件的请求,然后关闭表单页面。 $.ajax({url: url, type: post, data: {...}, dataType: json, success: function (result) {$.ajax(…