欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android中使用protobuf的具體示例

 更新時間:2018年03月09日 14:11:07   作者:Aron1001  
本篇文章主要介紹了Android中使用protobuf的具體示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

簡介

Google Protocol Buffers 簡稱 Protobuf,類似 json 或 XML,是一種序列化結(jié)構(gòu)數(shù)據(jù)的機制,但是比它們更小、更快、更簡單。同時支持多語言,跨平臺。

目前主要有兩個大版本:proto2 和 proto3。

其中 proto2 支持 Java、Python、 Objective-C、和 C++。

proto3 增加了對Go、JavaNano、Ruby、和 C#的支持。

proto例子

syntax = "proto3";
package tutorial;

import "google/protobuf/timestamp.proto";

option java_package = "com.katyusha.aron.demo";
option java_outer_classname = "AddressBookProtos";

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;

  enum PhoneType{
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    string number = 1;
    PhoneType type = 2;
  }

  repeated PhoneNumber phone = 4;

}

message AddressBook {
  repeated Person person = 1;
}

Protobuf使用.proto文件來定義數(shù)據(jù)格式,并同時提供編譯器將這些文件編譯為各種語言的源碼。

message 格式非常簡單。每種類型的 message 包含一個或者多個唯一編碼字段,每個字段由名稱和值類型組成,值類型可以是數(shù)字(整形或者浮點型)、布爾值、字符串、原始字節(jié),甚至是其他的 message(如上例所示)。Protobuf 允許 message 中包含 message,以達到分層嵌套。

值得注意的一點是,每個屬性都有唯一的一個tag,上面的0,1,2...等,這些tag非常重要,是 Prodobuf 編碼時使用的對每個屬性的唯一標(biāo)識符————Prodobuf 并不使用屬性名(name,id,email...)來編碼。因而,在定義過一個 message 之后,原則上都不應(yīng)該再修改每個屬性的tag,因為一旦修改,可能就會出現(xiàn)新老數(shù)據(jù)版本解析出錯的問題。

關(guān)鍵字

  1. syntax:聲明版本。例如上面syntax="proto3",如果沒有聲明,則默認(rèn)是proto2。
  2. package:聲明包名.
  3. import:導(dǎo)入包。類似于java,例如上面導(dǎo)入了timestamp.proto包。
  4. java_package:指定生成的類應(yīng)該放在什么Java包名下。如果你沒有顯式地指定這個值,則它簡單地匹配由package 聲明給出的Java包名,但這些名字通常都不是合適的Java包名 (由于它們通常不以一個域名打頭)。
  5. java_outer_classname:定義應(yīng)該包含這個文件中所有類的類名。如果你沒有顯式地給定java_outer_classname ,則將通過把文件名轉(zhuǎn)換為首字母大寫來生成。例如上面例子編譯生成的文件名和類名是AddressBookProtos。
  6. message:類似于java中的class關(guān)鍵字。
  7. repeated:用于修飾屬性,表示對應(yīng)的屬性是個array。

更多的關(guān)鍵字可以參考官方文檔,這里不做介紹。

在Android中的使用

先來看一下是proto在安卓使用中的流程:


首先創(chuàng)建proto文件,該文件定義了你要使用的數(shù)據(jù)的數(shù)據(jù)格式。

通過proto文件,編譯生成proto java class,生成的類中包含你需要的getter/setter,這個java class就類似于我們平常所用的java bean,但其還包含很多很多的別的功能函數(shù)。在android中, 我們可以通過集成Gradle Plugin for Protobuf來編譯proto文件。
Android Studio 配置

在項目根的gradle文件中添加如下內(nèi)容:

buildscript {
    repositories {
      jcenter()
      mavenCentral()
    }
    dependencies {
      classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.0'
    }
  }

在app module下的gradle文件中:

1 , 在apply plugin: 'com.android.application'后添加apply plugin: 'com.google.protobuf'

2, 添加protobuf塊(與android同級):

protobuf {
  protoc {
    artifact = 'com.google.protobuf:protoc:3.5.1' // 也可以配置本地編譯器路徑
  }

  generateProtoTasks {
    all().each { task ->
      task.builtins {
        remove java
      }
      task.builtins {
        java {}// 生產(chǎn)java源碼
      }
    }
  }
}

3, 指定.proto文件的路徑:

sourceSets {
    main {
      java {
        srcDir 'src/main/java'
      }
      proto {
        srcDir 'src/main/proto' //指定.proto文件路徑
      }
    }
  }

4 , 添加依賴:

api 'com.google.protobuf:protobuf-java:3.5.1'
api 'com.google.protobuf:protoc:3.5.1'

到這,android gradle環(huán)境就配置好了。此時可以編譯你的項目,會生成proto java class。這個類就是我們app后面要使用的。

代碼示例

定義proto文件:

syntax = "proto3";
package tutorial;

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
  string phone = 4;
}

通過網(wǎng)絡(luò)獲取數(shù)據(jù)流,然后解析成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實體類,就可以在界面進行顯示了:

textView.setText(person.toString());

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關(guān)文章

  • Android Studio中Run按鈕是灰色的快速解決方法

    Android Studio中Run按鈕是灰色的快速解決方法

    這篇文章主要介紹了Android Studio中Run按鈕是灰色的快速解決方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-03-03
  • Jetpack?Compose?的新型架構(gòu)?MVI使用詳解

    Jetpack?Compose?的新型架構(gòu)?MVI使用詳解

    這篇文章主要介紹了Jetpack?Compose?的新型架構(gòu)?MVI使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Android中使用 AutoCompleteTextView 實現(xiàn)手機號格式化附帶清空歷史的操作

    Android中使用 AutoCompleteTextView 實現(xiàn)手機號格式化附帶清空歷史的操作

    有個小伙伴遇到了這樣一個問題,就是AutoCompleteTextView實現(xiàn)自動填充的功能。同時要具備手機格式化的功能。接下來通過本文給大家分享使用 AutoCompleteTextView 實現(xiàn)手機號格式化附帶清空歷史的操作方法,需要的朋友參考下
    2017-03-03
  • Android編程中ViewPage判斷左右滑動方向的方法

    Android編程中ViewPage判斷左右滑動方向的方法

    這篇文章主要介紹了Android編程中ViewPage判斷左右滑動方向的方法,涉及Android中ViewPage針對滑動判定的相關(guān)技巧,非常簡單實用,需要的朋友可以參考下
    2015-10-10
  • Ubuntu Android源碼以及內(nèi)核下載與編譯

    Ubuntu Android源碼以及內(nèi)核下載與編譯

    本文主要介紹Android源碼的下載和編譯,這里整理了相關(guān)資料及如何下載和編譯的詳細步驟,有需要的小伙伴可以參考下
    2016-09-09
  • Android仿知乎日報開屏頁效果

    Android仿知乎日報開屏頁效果

    這篇文章主要為大家詳細介紹了Android仿知乎日報開屏頁效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Android批量修改文件格式/文件名的神操作分享

    Android批量修改文件格式/文件名的神操作分享

    最近工作中遇到了一個功能,需要批量修改文件格式,發(fā)現(xiàn)實現(xiàn)的過程挺值得分享的,所以下面這篇文章主要給大家介紹了關(guān)于Android批量修改文件格式/文件名的神操作,需要的朋友可以參考下
    2021-09-09
  • kotlin代碼中!!操作符的清楚方法

    kotlin代碼中??!操作符的清楚方法

    這篇文章主要給大家介紹了關(guān)于kotlin代碼中!!操作符的清楚方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • Android RecyclerView的簡單使用

    Android RecyclerView的簡單使用

    這篇文章主要為大家詳細介紹了Android RecyclerView簡單使用的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Android實現(xiàn)模仿UCweb菜單效果的方法

    Android實現(xiàn)模仿UCweb菜單效果的方法

    這篇文章主要介紹了Android實現(xiàn)模仿UCweb菜單效果的方法,較為詳細的分析了Android模仿UCweb菜單效果的頁面布局及功能實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10

最新評論