首页 技术 正文
技术 2022年11月15日
0 收藏 736 点赞 4,989 浏览 5759 个字

1.volley入门介绍

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

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

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

035 Android 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(非常经典)

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,907
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,432
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,247
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,058
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,690
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,728