以下操作均在androidStudio下進行
1. 在項目根目錄build.gradle下面添加protobuf-gradle-plugin插件
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.8'
2. 在Module下 的build.gradle添加以下配置
apply plugin: 'com.google.protobuf'
protobuf {
//配置protoc編譯器
protoc {
artifact = 'com.google.protobuf:protoc:3.5.1'
}
//這裏配置生成目錄,編譯後會在build的目錄下生成對應的java文件
generateProtoTasks {
all().each { task ->
task.builtins {
remove java
}
task.builtins {
java {}
}
}
}
}
在android 塊裏添加如下代碼
sourceSets {
main {
java {
srcDir 'src/main/java'
}
proto {
srcDir 'src/main/proto'
}
}
}
在dependencies塊裏添加依賴
// 定義protobuf依賴,使用精簡版
implementation 'com.google.protobuf:protobuf-java:3.10.0'
implementation 'com.google.protobuf:protoc:3.5.1'
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
3. 配置.proto文件和java代碼生成
在項目main文件夾下新建proto文件夾(與java同級)
把我們原先定義好的.protobuf文件拿過來。新增一行包路徑
我們build一下項目,就可以看到在/build/generated/source下會根據.proto文件生成對應的java代碼
4. 編寫請求demo
public static void testProto() {
ProtobufHandle.Request req = ProtobufHandle.Request.newBuilder().setCateId("1").setPage(1).setPageSize(10).build();
RequestBody requestBody = FormBody.create(MediaType.get("application/x-protobuf"), req.toByteArray());
Request build = new Request.Builder().url("http://192.168.31.130:8899/protobuf").post(requestBody).build();
Call call = new OkHttpClient().newCall(build);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.i("xiwang", "粗錯了");
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.body() == null){
return;
}
ProtobufHandle.Response resp = ProtobufHandle.Response.parseFrom(response.body().bytes());
for (int i = 0; i < resp.getDataListList().size(); i++) {
ProtobufHandle.Response.data t = resp.getDataList(i);
Log.i("xiwang", t.getId()+t.getTitle());
}
}
});
}
5. 在AndroidManifest.xml中添加網絡權限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
6. 測試效果
Android手機端收到響應:
Server端收到請求: