转载自: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是谷歌开发的
 
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的用法是整合于网络,不过写的清晰易懂
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的简单介绍和配合使用的更多相关文章

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

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

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

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

  3. Xutils, OKhttp, Volley, Retrofit对比

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

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

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

  5. [原创]关于mybatis中一级缓存和二级缓存的简单介绍

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

  6. 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍

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

  7. 利用Python进行数据分析(4) NumPy基础: ndarray简单介绍

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

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

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

  9. angular1.x的简单介绍(二)

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

随机推荐

  1. Ansible在Ubuntu上的安装

    #apt安装 apt-get install software-properties-common apt-add-repository ppa:ansible/ansible apt-get upd ...

  2. java基础语法2.

    第二章 2.1 class文件的生成 java文件为源代码文件 class为程序. class文件实时修改. eclipse自动生成. project下面clean. 2.2 jar文件 如何将有用的 ...

  3. 使用MyBatis Generator 1.3.7自动生成代码

    MyBatis Generator是一款mybatis自动代码生成工具,可以通过配置后自动生成文件. MyBatis Generator有几种方法可以生成代码,下面是其中一种.  一.官网下载 MyB ...

  4. FI 创建资产接口AS01

    FUNCTION ZREIP_CREATE_AS01TSET. *"------------------------------------------------------------- ...

  5. Docker镜像Push到DockerHub

    1.自己整理的容器首先通过commit做成本地镜像 docker commit -a "Cristin" -m "测试开发平台Jenkins" 281eef85 ...

  6. HADOOP HA 踩坑 - org.apache.hadoop.hdfs.qjournal.protocol.JournalNotFormattedException: Journal Storage Directory /mnt/data1/hadoop/dfs/journal/hdfscluster not formatted

    报错:在journalnode的log中: org.apache.hadoop.hdfs.qjournal.protocol.JournalNotFormattedException: Journal ...

  7. JavaScript的Let用法

    let 语句声明一个块级作用域的本地变量,并且可选的将其初始化为一个值. 描述 let 允许你声明一个作用域或被限制在块级中的变量.语句或者表达式. 与var不同的是,它声明的变量只能是全局或者整个函 ...

  8. box-sizing 和 dom width

    refer : https://developer.mozilla.org/en-US/docs/Web/API/CSS_Object_Model/Determining_the_dimensions ...

  9. fiddler修改response header

    if(oSession.host.Contains("baidu.com")){//根据host判断 oSession.RequestHeaders.Remove("Ac ...

  10. Cassandra集群:一,搭建一个三节点的集群

    环境准备 JDK1.8 http://download.oracle.com/otn/java/jdk/8u171-b11/512cd62ec5174c3487ac17c61aaa89e8/jdk-8 ...