Android项目使用Protobuf教程(结合Retrofit+RxJava及HttpURLConnection使用)
最近项目中使用到了protobuf,但是网上的关于protobuf在android中的使用教程是非常的少,Protobuf结合Retrofit+RxJava使用的教程几乎也没有,即使有相关介绍写得也不够全面,于是才有了这篇相对比较完整的文章(包括服务端和App端代码),希望可以帮助更多的人在android中使用protobuf。
请尊重原创,转载需要注明出处,大力哥的博客:https://blog.csdn.net/qq137722697
protobuf进阶篇已完成–> Android/Java中使用Protobuf的Any类型实现泛型解析
什么是Protobuf
Protobuf (全称 Protocol Buffers),是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面【Protobuf百度百科介绍】。简单点来说就是类似于Json、Xml,最主要的优点是比Json、Xml速度快,相信不久的将来应用会更加广泛。
以上只是简单的介绍,为了方便快速进入使用教程,本文默认你已经知道protobuf是什么、优缺点、应用场景、定义消息类型等,如未了解这些可参考以下文档:
- 中文版:Protobuf3语言指南(https://blog.csdn.net/u011518120/article/details/54604615)
- 英文版:Language Guide (proto3) (https://developers.google.com/protocol-buffers/docs/proto3?hl=zh-cn#generating)
Demo介绍
本文以用户登录为例(为啥又是登录?因为简单,容易理解呀),下面是demo的效果图:
app端:
服务端:
下面开始介绍如何实现
搭建.proto文件生成java类的环境
android中使用protobuf,过程是这样的:
- 1、定义proto文件;
- 2、使用该文件生成对应的java类;
- 3、利用该java类实现数据传输;
从以上过程中就可以看出,我们并不是直接使用proto文件,而是对应的java类,如何根据proto文件生成java类呢?官方推荐的是命令行的方式生成,但是Android Studio生成方式更加简单,这里直接介绍as生成方式(同样适用服务端开发工具intellij idea)
第一步
AS创建protobuf生成项目(用于专门生成对应的类),这里叫ProtobufGenerator
第二步
在根Project/build.gradle中加入protobuf插件
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.2' //as3.0以下的要0.8.0版本
}
}
第三步
在app/build.gradle中加入如下配置,底部加上
apply plugin: 'com.google.protobuf'
android{}中加入
sourceSets {
main {
java {
srcDir 'src/main/java'
}
proto {
srcDir 'src/main/proto'
}
}
}
android{}同级加入:
protobuf {
//配置protoc编译器
protoc {
artifact = 'com.google.protobuf:protoc:3.5.1'
}
//这里配置生成目录,编译后会在build的目录下生成对应的java文件
generateProtoTasks {
all().each { task ->
task.builtins {
remove java
}
task.builtins {
java {}
}
}
}
}
dependencies中加入protobuf相关依赖
compile 'com.google.protobuf:protobuf-java:3.1.0'
compile 'com.google.protobuf:protoc:3.1.0'
大致结构如下:
第四步
同步项目
第五步
安装proto支持插件,Settings–>Plugins–>搜索protobuf–>找到Protobuf Support点击安装,重启as即可,此时porto文件会有一个彩环,并且编写proto文件时也会有相应的提示
第六步
在app\src\main目录中新建proto文件夹,并新建对应的proto文件,这里以LoginRequest.proto为例
LoginRequest.proto文件内容为:
syntax = "proto3";
//生成的java类所在的包名
package com.zhys.protobufdemo;
//登录请求结构体
message LoginRequest {
string username = 1;
string pwd = 2;
}
//登录响应结构体
message LoginResponse {
int32 code = 1;
string msg = 2;
}
第七步
Build/Clean Project跑完即可,此时会在\app\build\generated\source\proto中生成对应的java文件,拷出来备用。
搭建服务端环境【可选,此步骤为服务端人员开发】
添加protobuf的jar包
本例使用intellij idea创建web项目(Eclipse类似),需要添加proto的jar包
方式一:maven添加protobuf,搜索protobuf即可
方式二:直接添加jar包,下载地址–>github的demo中有相关jar包
对外提供登录接口
将上一步骤中生成的LoginRequestOuterClas.java拷贝到本项目中,创建LoginServlet.java
LoginServlet.java的代码为:
//次注解需要tomcat7及以上不能才可以运行
@WebServlet("/login.action")
public class LoginServlet extends HttpServlet {
@Override
pro