Android實現protobuf客戶端

以下操作均在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端收到請求:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章