1.volley入门介绍

  开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。

  Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。

下图所示的这些应用都是属于数据量不大,但网络通信频繁的,因此非常适合使用Volley。


2.volley的使用环境配置

(1)添加volley的依赖

github地址:https://github.com/mcxiaoke/android-volley

implementation 'com.mcxiaoke.volley:library:1.0.19'

(2)声明网络权限

//网络权限,当禁用后,无法进行检索等相关业务
<uses-permission android:name="android.permission.INTERNET" />

3.StringRequest的用法

(1)获取到一个RequestQueue对象

//取得请求队列
RequestQueue requestQueue = Volley.newRequestQueue(getActivity());

  RequestQueue是一个请求队列对象,它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求。RequestQueue内部的设计就是非常合适高并发的,因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,这是非常浪费资源的,基本上在每一个需要和网络交互的Activity中创建一个RequestQueue对象就足够了。
(2)创建一个StringRequest对象

(3)将这个StringRequest对象添加到RequestQueue里面就可以了

//将请求添加到队列中
requestQueue.add(request);

 4.使用案例

package com.example.administrator.test66smartbeijing.fragment;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.example.administrator.test66smartbeijing.R;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map; /**
* 利用tabLayout+viewPager实现带顶部菜单栏的fragment
*/
public class NewsCenterVolleyFragment extends Fragment { //handler用来处理消息
@SuppressLint("HandlerLeak")
Handler handler=new Handler(){
@SuppressLint("ResourceType")
@Override
public void handleMessage(Message msg) {
//更新ui
if(msg.what==0x01){
//接收到消息后,从当前的fragment跳转到另一个activity中
String queryResultStr= (String) msg.obj;
}
}
}; @Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
getDataFromServer();
View view=inflater.inflate(R.layout.layout_fm_newscenter_volley,container,false);
return view; } private void getDataFromServer() {
//请求地址
String url = "http://118.25.152.62:8080/SmartBeijingJavaWeb_war/JsonServlet"; //注①
String tag = "BasicMessage"; //注② //取得请求队列
final RequestQueue requestQueue = Volley.newRequestQueue(getActivity()); //防止重复请求,所以先取消tag标识的请求队列
requestQueue.cancelAll(tag); //创建StringRequest,定义字符串请求的请求方式为POST(省略第一个参数会默认为GET方式)
//一个StringRequest对象,StringRequest的构造函数需要传入4个参数。
// 第1个参数就是http请求的方式:Request.Method.POST,第2个参数就是目标服务器的URL地址:url。
// 第3个参数是服务器响应成功的回调:new Response.Listener<String>(),第4个参数是服务器响应失败的回调:new Response.ErrorListener()。
final StringRequest request = new StringRequest(Request.Method.POST, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
String queryResultStr="";
//注意:当response为空时,说明服务器无响应(服务器端的代码有问题)
if(!TextUtils.isEmpty(response)){
JSONObject jsonObject = (JSONObject) new JSONObject(response).get("params"); //注③
queryResultStr=jsonObject.toString();
System.out.println(queryResultStr); //当服务器连接成功,获得响应后,用Message对象传递消息,在Activity或fragment中处理。
Message message=new Message();//实例化message
message.what=0x01;//设置消息发送的验证码
message.obj=queryResultStr;//设置消息的内容
handler.sendMessage(message); //利用handler发送消息
}else {
Toast.makeText(getActivity(),"请求未响应",Toast.LENGTH_SHORT).show();
} } catch (JSONException e) {
//做自己的请求异常操作,如Toast提示(“无网络连接”等)
Log.e("TAG", e.getMessage(), e);
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//做自己的响应错误操作,如Toast提示(“请稍后重试”等)
Log.e("TAG", error.getMessage(), error);
}
}) {
//设置要提交给服务器的参数,若无需提交参数给服务器,可以不重写该方法
@Override
protected Map<String, String> getParams() throws AuthFailureError {
//创建一个Map集合,用于存储元素对(称作“键”和“值”),其中每个键映射到一个值
Map<String, String> params = new HashMap<>();
return params;
}
}; //设置Tag标签
request.setTag(tag); //将请求添加到队列中
requestQueue.add(request);
} }

注意:url请求是用servlet,服务器端的javaweb必须采用servlet,即服务器和客户端的请求要相互匹配。

5.控制台输出从服务器获取的json数据。

System.out: {"Result":"{\"retcode\":200,\"data\":[{\"id\":10000,\"title\":\"新闻\",\"type\":1,\"children\":[{\"id\":10007,\"title\":\"北京\",\"type\":1,\"url\":\"\/10007\/list_1.json\"},{\"id\":10006,\"title\":\"中国\",\"type\":1,\"url\":\"\/10006\/list_1.json\"},{\"id\":10008,\"title\":\"国际\",\"type\":1,\"url\":\"\/10008\/list_1.json\"},{\"id\":10010,\"title\":\"体育\",\"type\":1,\"url\":\"\/10010\/list_1.json\"},{\"id\":10091,\"title\":\"生活\",\"type\":1,\"url\":\"\/10091\/list_1.json\"},{\"id\":10012,\"title\":\"旅游\",\"type\":1,\"url\":\"\/10012\/list_1.json\"},{\"id\":10095,\"title\":\"科技\",\"type\":1,\"url\":\"\/10095\/list_1.json\"},{\"id\":10009,\"title\":\"军事\",\"type\":1,\"url\":\"\/10009\/list_1.json\"},{\"id\":10093,\"title\":\"时尚\",\"type\":1,\"url\":\"\/10093\/list_1.json\"},{\"id\":10011,\"title\":\"财经\",\"type\":1,\"url\":\"\/10011\/list_1.json\"},{\"id\":10094,\"title\":\"育儿\",\"type\":1,\"url\":\"\/10094\/list_1.json\"},{\"id\":10105,\"title\":\"汽车\",\"type\":1,\"url\":\"\/10105\/list_1.json\"}]},{\"id\":10002,\"title\":\"专题\",\"type\":10,\"url\":\"\/10006\/list_1.json\",\"url1\":\"\/10007\/list1_1.json\"},{\"id\":10003,\"title\":\"组图\",\"type\":2,\"url\":\"\/10008\/list_1.json\"},{\"id\":10004,\"title\":\"互动\",\"type\":3,\"excurl\":\"\",\"dayurl\":\"\",\"weekurl\":\"\"}],\"extend\":[10007,10006,10008,10014,10012,10091,10009,10010,10095]}"}

参考文献:https://blog.csdn.net/Mr_Megamind/article/details/71404618(非常经典)

035 Android Volley框架进行网络请求的更多相关文章

  1. Volley框架之网络请求和图片加载

    Volley是 Google 推出的 Android 异步网络请求框架和图片加载框架. Volley的特性 (1).封装了的异步的请求API.Volley 中大多是基于接口的设计,可配置性强.(2). ...

  2. Android Volley框架的使用(1)

    在Android开发中,经常要通过HTTP请求访问网络.为了使通过HTTP请求访问网络的过程更加简单,2013年提出了新的HTTP通信框架--Volley.Volley使用起来非常简单,适用于网络访问 ...

  3. Android探索之HttpURLConnection网络请求

    前言: 最近一直想着学习一下比较好的开源网络框架okhttp,想着学习之前还是先总结一下Android原生提供的网络请求.之前一直在使用HttpClient,但是android 6.0(api 23) ...

  4. Android Volley框架的使用(四)图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)

    在开发安卓应用中避免不了要使用到网络图片,获取网络图片很简单,但是需要付出一定的代价——流量.对于少数的图片而言问题不大,但如果手机应用中包含大量的图片,这势必会耗费用户的一定流量,如果我们不加以处理 ...

  5. Volley与XUtils网络请求使用对比,心得,两者基本使用

    之前一直使用的Volley作为网络请求框架,它是Google 在2013年的I/O大会 上,发布的.Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮,同时扩展性很强.在 ...

  6. Android Volley 框架的使用(一)

    为什么要使用Volley框架 开发android应用很多时候都要涉及网络操作,Android SDK中提供了HttpClient 和 HttpUrlConnection两种方式用来处理网络操作,但当应 ...

  7. Android Volley框架的使用(三)

     此博文源码下载地址  https://github.com/Javen205/VolleyDemo.git Image Request 为了更方便的使用Volley中的图片请求,我们同样先在Voll ...

  8. Android Volley框架的使用(二)

     此博文源码下载地址  https://github.com/Javen205/VolleyDemo.git 使用请求队列RequestQueue Volley中的Request都需要添加到Reque ...

  9. Volley框架支持HTTPS请求。

    第一次写帖子,嘿嘿. 最近了解到google2013IO大会出了个网络框架,正好项目也需要用到,就看了下. 最后发现接口都是HTTPS的,但是Volley默认是不支持HTTPS,网上找了好久,都没有对 ...

随机推荐

  1. pve 导入 ova

    匆忙记录 Proxmox includes qm importdisk as command. Extract your ova: tar -xvf *.ova Create a new VM wit ...

  2. JS-选项卡制作解释部分

    <!DOCTYPE html> <html> <head> <meta name="author" content "郭菊锋,7 ...

  3. [内网渗透]IPC$共享连接

    0x01 简介 IPC$(Internet Process Connection)是共享"命名管道"的资源,它是为了让进程间通信而开放的命名管道,可以通过验证用户名和密码获得相应的 ...

  4. 实验五 遇到的问题:openssl: error while loading shared libraries: libssl.so.1.1

    遇到的问题 命令行:linux@ubuntu64-vm:~/exp/exp5$ openssl enc -aes-128-cbc -in test_aes.txt -out out.txt -pass ...

  5. html同行两个div浮动后下一个div怎么换行的问题

    传送门:https://blog.csdn.net/asdfg6541/article/details/78514535

  6. Vue 使用axios分片上传

    Vue的界面 <input type="file"/> 上传方法 fileUpload: function () { var num = 1 var file = do ...

  7. Jenkins定时任务的配置

    在任务配置中,在 构建触发器(Build Triggers)-->勾选"定时构建"-->在输入框中配置触发时间表达式 以上配置,类似cron表达式,表示在5月27日23 ...

  8. 小D课堂 - 零基础入门SpringBoot2.X到实战_第10节 SpringBoot整合定时任务和异步任务处理_41、SpringBoot定时任务schedule讲解

    笔记 1.SpringBoot定时任务schedule讲解     简介:讲解什么是定时任务和常见定时任务区别 1.常见定时任务 Java自带的java.util.Timer类            ...

  9. matplotlib 常用操作

    标准的Python中用列表(list)保存一组值,可以当作数组使用.但由于列表的元素可以是任何对象,因此列表中保存的是对象的指针.这样一来,为了保存一个简单的列表[1,2,3],就需 要有三个指针和三 ...

  10. shiro解决一个账号异地登录的问题

    如下,找到session中的信息删除即可,按照这个方式试了下.基本可用 在多台服务器部署时,前提必须实现session共享. /** * 登录认证 * @param token * @return * ...