volley入门学习(一)
Volley学习
一、Volley介绍
Volley是一个网络通信框架,在2013年的Google I/O被推出。
Volley是一个优秀的网路访问框架,即可以通过它访问普通的网络数据,如JSON格式的数据,也可以下载图片。
数据量不大,但网络通信频繁的,因此非常适合使用Volley。
数据量的网络操作,比如说下载文件等,不建议使用。
二、 使用步骤
1.添加依赖
implementation 'com.android.volley:volley:1.1.1'
2.配置网络环境(AndroidMainfest.xml)
<uses-permission android:name="android.permission.INTERNET" />
3.使用
3 .1创建请求队列
参数为context
RequestQueue requestQueue= Volley.newRequestQueue(getApplicationContext());
3.2 创建HTTP请求
一共3个参数 1.url 2.请求成功回调函数 3请求失败回调函数
StringRequest stringRequest=new StringRequest("https://www.baidu.com",
//请求成功执行
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("TAG", response);
}
},
//请求失败执行
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("TAG", error.getMessage(),error);
}
}
);
3.3将请求加入到请求队列当中
requestQueue.add(stringRequest);
结果(百度首页的html源码)
#三、 post请求
介绍完上述代码,你对Volley已经有了初步的认识,但是上面的代码可以看出是个get请求,如果想要请求post请求怎么办呢?下面就简单介绍一下如何请求post吧
StringRequest stringRequest=new StringRequest(Request.Method.POST, "https://www.baidu.com", new Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("TAG", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("TAG", error.getMessage(),error);
}
}){
//重写getParams,用于给post请求传参数
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> map = new HashMap<String, String>();
map.put("params1", "value1");
map.put("params2", "value2");
return map;
}
};
可以看出来和get最大的区别有两点:
1.在StringRequest的方法中多了个参数Request.Method.POST,用于指定请求为Post
2.重写getParams方法,用于给post请求传递参数使用的
四、 JsonRequest
学完了最基本的StringRequest的用法,我们再来进阶学习一下JsonRequest的用法。类似于StringRequest,JsonRequest也是继承自Request类的,不过由于JsonRequest是一个抽象类,因此我们无法直接创建它的实例,那么只能从它的子类入手了。JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest,从名字上你应该能就看出它们的区别了吧,一个是用于请求一段JSON数据的,一个是用于请求一段JSON数组的。
1.后端地址数据
http://10.138.154.240:8084/yibole/getAllRecruiters
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FuzBzauV-1607527656126)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201209002112872.png)]
2.JsonRequest发起请求
JsonRequest jsonRequest=new JsonObjectRequest("http://10.138.154.240:8084/yibole/getAllRecruiters", null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d("TAG", response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
3.遇到的问题
在请求我后端写的json数据的时候,出现了一下两种问题
3.1问题一
解决方案:
一开始我直接访问结果报一下错误,后来查资料发现Android 9.0是默认禁止所有http请求的,需要在代码中设置如以下代码才可以正常进行网络请求,如果想用http请求就需要添加
android:usesCleartextTraffic="true"
3.2问题二
本来我一开始访问的后端地址为:http://localhost:8084/yibole/getAllRecruiters
结果。。。
解决方案:
cmd->ipconfig 查找ipv4地址
将localhost换成ipv4地址的地址即可
五、ImageRequest
1.介绍
故名思意,可知改方法主要是为了获取网络图片的,和ImageLoader 一样目的都是相同的,那么具体步骤和前面介绍的几个方法一样,要先创建消息队列,然后创建ImageRequest(包含的url,请求失败,请求成功的回调函数)
这里区别与上面讲述的,这里的回调函数是直接new Listener(){} 而不是new Response.Listener
2.代码
/**
* ImageRequest方法访问图片
*/
public void ImageRequestMethod(){
imageRequest = new ImageRequest("http://pic.2265.com/upload/2017-4/2017414114518780.jpg", new Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
Log.d("sa", "onBitmapResponse: "+response);
//在此处将网络获取的结果通过imageview提供的setImageBitmap来设置图片显示出来
imageView.setImageBitmap(response);
}
}, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("sa", "onErrorResponse: "+error);
//加载错误默认为
imageView.setImageResource(R.drawable.default_img);
}
});
}
六、ImageLoader
1.优点
ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。
2.步骤
-
创建一个RequestQueue对象。
-
创建一个ImageLoader对象。
-
获取一个ImageListener对象。
-
调用ImageLoader的get()方法加载网络上的图片。
3.分析
首先我们需要创建ImageLoader对象(参数为消息队列,和ImageCache),其次我们需要通过ImageLoader得到ImageListener(包含ImageView控件,默认图片资源,加载网络请求失败默认图片),最后通过创建的ImageLoader的get方法(包含,网络图片url和第二步的监听事件)
4.代码
//创建请求队列
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
/**
* ImageLoader方法
*/
public void ImageLoaderMethod(){
//1.创建ImageLoader
imageLoader=new ImageLoader(requestQueue, new ImageLoader.ImageCache() {
@Override
public Bitmap getBitmap(String url) {
return null;
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
}
});
//2.ImageLoader.getImageListener
ImageLoader.ImageListener listener =ImageLoader.getImageListener(imageView,R.drawable.default_img,R.drawable.ic_launcher_background);
//3.
imageLoader.get("https://img-blog.csdnimg.cn/20201201233652605.png", listener,200,600);
}
七、交流群
优秀的Android视频和书籍资料网盘免费分享,技术一起交流