[译]Android Protobuf实例教程
来源:互联网 发布:windows控制面板命令 编辑:程序博客网 时间:2024/05/27 02:30
Android Protobuf实例教程
原文链接:https://android.jlelse.eu/simple-android-protobuf-tutorial-with-actual-code-bfb581299f47
寻找可能比JSON更好的东西?查看Google Protocol Buffers(简称Protobuf)。
已经有大量与JSON比较的文章了。
http://blog.codeclimate.com/blog/2014/06/05/choose-protocol-buffers/
https://auth0.com/blog/beating-json-performance-with-protobuf/
这里我将分享一个示例代码演示如何创建一个从网络服务读取Protobuf数据的Android应用。
如何工作
首先我解释下代码如系统如何在Android Studio环境里运行的。如图所示。
为了支持Protobuf,首先创建PROTO文件。该文件描述了共享数据的基本格式,并且该文件可在使用它的各种实体(例如,Webservice,客户端应用,Android)之间共享(或复制)。它可被视为整个实体的协议。
然后PROTO文件用于生成指定语言(例如Android使用的Java)的Proto类。这是通过PROTOC工具完成的。可在Android Studio外部执行此命令,并将生成的文件拷贝到代码里使用。但是使用Gradle Plugin for Protobuf,就可以在Android Studio中自动进行配置和转换。
一旦生成java文件,就可以引入Proto类并在App代码中使用数据模型对象了。
示例应用
PROTO文件
下面我写了一个包含一些String和INteger成员变量的PROTO文件。更多关于proto语法的信息,请参考google开发者文档.
syntax = "proto3";package tutorial;message Person { string name = 1; int32 id = 2; string email = 3; string phone = 4;}
文件保存在工程的app/src/main/proto文件夹。
Gradle环境
项目的根build.gradle文件中,添加以下classpath在dependencies部分。
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.3'
在应用的build.gradle文件中,添加以下implementation在dependencies部分。
implementation 'com.google.protobuf:protobuf-lite:3.0.0'
文件顶部添加插件
apply plugin: 'com.google.protobuf'
为了从PROTO文件生成Proto类,添加如下代码到build.gradle。
protobuf { protoc { artifact = 'com.google.protobuf:protoc:3.0.0' } plugins { javalite { artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0' } } generateProtoTasks { all().each { task -> task.builtins { remove java } task.plugins { javalite { } } } }}
到这,gradle环境准备完毕。如果想定制一些功能(例如,修改生成文件的位置等),可查看Gradle Plugin for Protobuf。
应用代码
gradle环境建立好后,可编译应用代码,并访问Proto的Java类。现在剩下的部分就是从服务器获取数据了。
可作为普通的网络服务数据完成(例如类似获取JSON数据)。我使用Okhttp执行一个简单的网络提取。
当获取到数据后,使用Proto数据模型类获取输入流。在我们的例子里,他是Person类(在PROTO文件中定义)。
Request request = new Request.Builder().url(url).build();Call call = okHttpClient.newCall(request);Response response = call.execute();if (response.isSuccessful()) { ResponseBody responseBody = response.body(); if (responseBody != null) { return Person.parseFrom(responseBody.byteStream()); }}
得到Person对象后,就可以使用getEmail(),getName()等方法…就像PROTO文件定义那样。为了简单,我只在示例代码中转换成String并打印到TextView。
- [译]Android Protobuf实例教程
- Netty+ProtoBuf的实例教程
- Android 实例教程
- protobuf&android
- android protobuf
- Android SAX解析实例教程
- Android ProGuard实例教程
- Android图像处理实例教程
- Android ProGuard实例教程
- Android Protobuf 初探笔记
- android 用protobuf
- android protobuf错误
- protobuf android ndk makefile
- Android使用protobuf
- Android使用protobuf插件
- Android Websocket+protobuf使用
- Android实现程序自动更新实例教程
- android图片缩放、放大demo - Android实例教程
- IDEA快捷键
- Linux-进程、进程组、作业、会话、控制终端详解
- JQuery插件库
- 用训练好的模型测试单张图片存在的问题
- [转载]Spring Cloud基础教程
- [译]Android Protobuf实例教程
- 请求报错406
- SpringMVC实体类时间格式化
- ist的三种遍历方法
- ns3下利用insight排查waf错误
- java.lang.IllegalStateException: Max number of active transactions reached:50
- Hough
- MyBatis if标签比较字符串
- mysql学习