Okhttp、Volley和Gson的简单介绍和配合使用

时间:2022-08-31 13:15:45

转载自:http://www.apkbus.com/home.php?mod=space&uid=784586&do=blog&id=61255

1.okhttp是一个高效的、快速的被谷歌认可的,支持HTTP/2和SPDY
 
volley是一个方便网络任务库,可以负责请求、加载、缓存等同步问题,也可以处理图片、JSON、文本操作起来比较简单
 
gson是JSON序列化和反序列化(以上三个能相互间轻松使用主要还是因为okhttp是谷歌推荐的、volley是谷歌开发的、Gson是谷歌开发的Okhttp、Volley和Gson的简单介绍和配合使用
 
2.okhttp的Get用法:
首先下载jar包,jar包的下载地址我不在发链接!

[代码]java代码:

01
02
03
04
05
06
07
08
09
10
11
12
OkHttpClient client = new OkHttpClient();
 
 public void execute() throws Exception {
        Request request = new Request.Builder()
                .url("http://www.apkbus.com/forum.php")
                .build();
        Response response = client.newCall(request).execute();
        if(response.isSuccessful()){
            
            System.out.println(response.body().string());
        }
    }
Android本身不允许UI做网络线程,要开启一个子线程;Okhttp支持异步线程并回调返回,上面的方法稍加改动即可:
 

[代码]java代码:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
private void enqueue(){
        Request request = new Request.Builder()
                .url("http://www.apkbus.com/forum.php")
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
 
            }
 
            @Override
            public void onResponse(Response response) throws IOException {
                //NOT UI Thread
                if(response.isSuccessful()){
                    System.out.println(response.body().string());
                }
            }
        });
    }
 
Okhttp的post的用法:
 
RequestBody formBody = new FormEncodingBuilder()
    .add("platform", "android")
    .add("name", "chace")
    .add("subject", "乾隆十八掌")
    .build();
 
    Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
 
Response response = client.newCall(request).execute();
    if (response.isSuccessful()) {
        return response.body().string();
    } else {
        throw new IOException("Unexpected code " + response);
    }
 
这个代码是同步网络请求,异步就改成enqueue就行了。
 
这个okhttp和gson的用法是整合于网络,不过写的清晰易懂Okhttp、Volley和Gson的简单介绍和配合使用
json串:
{
    "data": [
        {
            "appcontent": "1",
            "appname": "UC浏览器",
            "apppackagename": "com.UCMobile",
            "id": 1,
            "remark": "1"
        },
        {
            "appname": "支付宝",
            "apppackagename": "com.alipay.android.app",
            "id": 2
        },
        {
            "appname": "WPS",
            "apppackagename": "cn.wps.moffice_eng",
            "id": 3
        }
    ],
    "msg": "获取信息列表成功",
    "version": 2
}
 
建立javaBean:
这是数组里面的属性:
public class ApkInfo {  
    private String apppackagename;  
    private Integer id;  
    private String appname;  
    private String appcontent;  
    private String remark;  
    public String getApppackagename() {  
        return apppackagename;  
    }  
  
    public void setApppackagename(String apppackagename) {  
        this.apppackagename = apppackagename;  
    }  
  
    public Integer getId() {  
        return id;  
    }  
  
    public void setId(Integer id) {  
        this.id = id;  
    }  
  
    public String getAppname() {  
        return appname;  
    }  
  
    public void setAppname(String appname) {  
        this.appname = appname;  
    }  
  
    public String getAppcontent() {  
        return appcontent;  
    }  
  
    public void setAppcontent(String appcontent) {  
        this.appcontent = appcontent;  
    }  
  
    public String getRemark() {  
        return remark;  
    }  
  
    public void setRemark(String remark) {  
        this.remark = remark;  
    }  
  
    @Override  
    public String toString() {  
        return "ApkInfo [id=" + id + ", remarm="  
                + remark + ", appname=" + appname + ", appcontent=" + appcontent  
                + ", apppackagename=" + apppackagename + "]";  
      
    }  
}  
 
这是外部集合的属性:
public class PackageListInfo {  
    private String msg;  
    private String version;  
    private List<Object> data;  
  
    public String getMsg() {  
        return msg;  
    }  
      
    public void setMsg(String msg) {  
        this.msg = msg;  
    }  
      
    public String getVersion() {  
        return version;  
    }  
      
    public void setVersion(String version) {  
        this.version = version;  
    }  
      
    public List<Object> getData() {  
        return data;  
    }  
  
    public void setData(List<Object> data) {  
        this.data = data;  
    }  
      
    @Override  
    public String toString() {  
        return "PackageListInfo [version=" + version + ", data=" + data + ", msg=" + msg  
                + "]";  
    }  
  
}  
 
新建一个OKHTTP的管理类get得到JSON数据,并进行处理。
import android.util.Log;  
import okhttp3.Call;  
import okhttp3.Callback;  
import okhttp3.OkHttpClient;  
import okhttp3.Request;  
import okhttp3.Response;  
  
public class GetApkPackage {  
  
    public static String apkPackageUrl = http://192.168.10.133:8080/getAppInfor;  
      
    public static GetApkPackage install = new GetApkPackage();  
      
    public static ArrayList<String> appList=new ArrayList<String>();  
      
    public void getPackage() {  
        OkHttpClient mOkHttpClient = new OkHttpClient();  
        final Request request = new Request.Builder().url(apkPackageUrl).build();  
        mOkHttpClient.newCall(request).enqueue(new Callback() {  
  
            @Override  
            public void onFailure(Call call, IOException e) {  
                System.out.println("获取apk列表失败");  
                Log.d("GetApkPackage", e.getMessage());  
                  
            }  
            @Override  
            public void onResponse(Call call, Response response) throws IOException {  
                String result = response.body().string();  
                System.out.println(result);  
                //InputStream is = response.body().byteStream();  
                //byte[] bytes = response.body().bytes();  
                Gson gson = new Gson();  
                PackageListInfo packlist = gson.fromJson(result,PackageListInfo.class);  
                  
                System.out.println(packlist.getData().toString());  
                List<ApkInfo> apkList = new ArrayList<ApkInfo>();  
                Type type = new TypeToken<ArrayList<ApkInfo>>() {}.getType();  
                apkList = gson.fromJson(packlist.getData().toString(), type);  
                /* 
                Map<String,ApkInfo> apkList = gson.fromJson(packlist.getData().toString(),   
                        new TypeToken<List<ApkInfo>>() {   
                        }.getType()); 
                */  
                if(apkList == null){  
                    System.out.println("apkpackage列表为空");  
                    return;  
                }  
                for(int i =0;i<apkList.size();i++){    
                      String apkName = apkList.get(i).getApppackagename();  
                      System.out.println(apkName);   
                      appList.add(apkName);  
        
              }   
            }  
        });  
    }  
      
    public static GetApkPackage getInstall(){         
        return install;  
    }  
  
}  
上述代码中,对JSON数据的处理看起来很简单,只要new一个GSON实例,然后通过gson.fromJson方法,就能够得到json数据
[java] view plain copy 在CODE上查看代码片派生到我的代码片
Gson gson = new Gson();  
PackageListInfo packlist = gson.fromJson(result,PackageListInfo.class); 
 
OKHTTP发送一个字符串给服务器的实例如下:
[java] view plain copy 在CODE上查看代码片派生到我的代码片
public final class PostString {  
  public static final MediaType MEDIA_TYPE_MARKDOWN  
      = MediaType.parse("text/x-markdown; charset=utf-8");  
  
  private final OkHttpClient client = new OkHttpClient();  
  
  public void run() throws Exception {  
    String postBody = ""  
        + "Releases\n"  
        + "--------\n"  
        + "\n"  
        + " * _1.0_ May 6, 2016\n"  
        + " * _1.1_ June 15, 2016\n"  
        + " * _1.2_ August 11, 2016\n";  
  
    Request request = new Request.Builder()  
        .url("https://192.168.10.133:8080/base")  
        .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, postBody))  
        .build();  
  
    Response response = client.newCall(request).execute();  
    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);  
  
    System.out.println(response.body().string());  
  }  
  
  public static void main(String... args) throws Exception {  
    new PostString().run();  
  }  
}  
 
3.Volley的用法:
Volley提供了JsonObjectRequest、JsonArrayRequest、StringRequest等Request形式。
JsonObjectRequest:返回JSON对象。
JsonArrayRequest:返回JsonArray。
StringRequest:返回String,这样可以自己处理数据,更加灵活。
 
我们创建一个StringRequest:
StringRequest stringRequest = new StringRequest("http://www.apkbus.com/forum.php",  
                        new Response.Listener<String>() {  
                            @Override  
                            public void onResponse(String response) {  
                                Log.d("TAG", response);  
                            }  
                        }, new Response.ErrorListener() {  
                            @Override  
                            public void onErrorResponse(VolleyError error) {  
                                Log.e("TAG", error.getMessage(), error);  
                            }  
                        });  
 
这篇主要还是简单了介绍了三者的关系和用法Okhttp、Volley和Gson的简单介绍和配合使用

Okhttp、Volley和Gson的简单介绍和配合使用的更多相关文章

  1. OkHttp使用教程——网络操作之OkHttp&comma; Volley以及Gson

    写这篇文章的动机 在安卓项目中有一个问题可能无法避免:网络.不管你是加载图片,请求API数据还是从因特网上获得一个字节,你都是在使用网络. 鉴于网络在安卓中的重要性与基础性,当今安卓开发者面临的问题之 ...

  2. Https系列之一:https的简单介绍及SSL证书的生成

    Https系列会在下面几篇文章中分别作介绍: 一:https的简单介绍及SSL证书的生成二:https的SSL证书在服务器端的部署,基于tomcat,spring boot三:让服务器同时支持http ...

  3. Xutils&comma; OKhttp&comma; Volley&comma; Retrofit对比

    Xutils这个框架非常全面,可以进行网络请求,可以进行图片加载处理,可以数据储存,还可以对view进行注解,使用这个框架非常方便,但是缺点也是非常明显的,使用这个项目,会导致项目对这个框架依赖非常的 ...

  4. Okhttp之RealConnection建立链接简单分析

    在之前的博客中我们知道Okhttp在发起链接请求先从链接池中获取连接,如果链接池中没有链接则创建新的链接RealConnection对象,然后执行其connet方法打开SOCKET链接(详见< ...

  5. &lbrack;原创&rsqb;关于mybatis中一级缓存和二级缓存的简单介绍

    关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...

  6. 利用Python进行数据分析&lpar;7&rpar; pandas基础&colon; Series和DataFrame的简单介绍

    一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...

  7. 利用Python进行数据分析&lpar;4&rpar; NumPy基础&colon; ndarray简单介绍

    一.NumPy 是什么 NumPy 是 Python 科学计算的基础包,它专为进行严格的数字处理而产生.在之前的随笔里已有更加详细的介绍,这里不再赘述. 利用 Python 进行数据分析(一)简单介绍 ...

  8. yii2的权限管理系统RBAC简单介绍

    这里有几个概念 权限: 指用户是否可以执行哪些操作,如:编辑.发布.查看回帖 角色 比如:VIP用户组, 高级会员组,中级会员组,初级会员组 VIP用户组:发帖.回帖.删帖.浏览权限 高级会员组:发帖 ...

  9. angular1&period;x的简单介绍&lpar;二&rpar;

    首先还是要强调一下DI,DI(Denpendency Injection)伸手获得,主要解决模块间的耦合关系.那么模块是又什么组成的呢?在我看来,模块的最小单位是类,多个类的组合就是模块.关于在根模块 ...

随机推荐

  1. CSS3--响应式布局

    一.流式布局 不再使用px作为盒模型布局,而是采用百分比布局宽高,定位等. 公式:目标元素宽度/上下文元素宽度=百分比宽度 目标定位/上下文元素宽度或高度=定位距离(保留5位小数点) 用em/rem来 ...

  2. Codeforces Beta Round &num;69 &lpar;Div&period; 1 Only&rpar; C&period; Beavermuncher-0xFF 树上贪心

    题目链接: http://codeforces.com/problemset/problem/77/C C. Beavermuncher-0xFF time limit per test:3 seco ...

  3. python登录csdn并自动评论下载资源脚本

    功能 1.自动登录csdn 2.查找未评论的资源并自动评论 用到的库 1.python自带的requests,获取以及发送网页数据 2.python自带的time,用作休眠,csdn资源一段时间内只允 ...

  4. TCP&sol;IP详解之:IP选路 动态选路协议

    第九章 IP选路 netstat -rn 显示路由表 初始化路由表的两种方法: 方法1:在配置文件中指定静态路由(不常用) 方法2:运行路由守护程序 或者 使用ICMP路由器发现报文 没有到达目的地的 ...

  5. 代码契约CodeContract(八)

    代码契约(Code Contract):它并不是语言本身的新功能,而是一些额外的工具,帮助人们控制代码边界. 代码契约之于C#,就相当于诗词歌赋之于语言. --- C# in Depth 一,概述 1 ...

  6. 建立、配置和使用Activity——启动、关闭Activity

    一个Android应用通常都会包含多个Activity,但只有一个Activity会作为程序的入口——当该Android应用运行时将会自启动并执行该Activity.至于应用中的其他Activity, ...

  7. defaultdict的威力

    >>> from collections import defaultdict >>> s='mmississippi' >>> d=defaul ...

  8. 【原创】大叔问题定位分享(15)spark写parquet数据报错ParquetEncodingException&colon; empty fields are illegal&comma; the field should be ommited completely instead

    spark 2.1.1 spark里执行sql报错 insert overwrite table test_parquet_table select * from dummy 报错如下: org.ap ...

  9. cf463d

    这题说的是给了k个串算出这k个串的最长公共子序列,这k个串每个串都是由1--n的数字组成的. 将第一串的数字按照顺序重新编号为123...n 然后后面的串按照这个编号重新标号,就转化为下面每个串大最长 ...

  10. Connection reset原因分析和解决方案

    在使用HttpClient调用后台resetful服务时,“Connection reset”是一个比较常见的问题,有同学跟我私信说被这个问题困扰很久了,今天就来分析下,希望能帮到大家.例如我们线上的 ...