为了编译proto文件,引入protobuf插件
1、项目build.gradle加入
dependencies { classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.18' }
2、模块buid.gradle加入
apply plugin: 'com.google.protobuf'
protobuf {
protoc {
artifact = "com.google.protobuf:protoc:3.11.0"
}
// Generates the java Protobuf-lite code for the Protobufs in this project. See
// https://github.com/google/protobuf-gradle-plugin#customizing-protobuf-compilation
// for more information.
generateProtoTasks {
all().each { task ->
task.builtins {
java {
option 'lite'
}
}
}
}
}
dependencies {
implementation "com.google.protobuf:protobuf-javalite:3.11.0"
}
3、编辑proto文件
proto语法Language Guide (proto3) | Protocol Buffers | Google Developers
路径必须为app/src/main/proto
setting.proto文件
syntax = "proto3";
option java_package = "com.demo.test.data";
option java_multiple_files = true;
message YuanxzhSetting {
int32 age = 1;
bool isMale = 2;
string name = 3;
}
1、2、3代表的是第几个字段
现在重新编译就可以生成YuanxzhSetting类了
4、
private static class SettingSerializer implements Serializer<YuanxzhSetting> {
@Override
public YuanxzhSetting getDefaultValue() {
return YuanxzhSetting.getDefaultInstance();
}
@Nullable
@Override
public YuanxzhSetting readFrom(@NonNull InputStream inputStream, @NonNull Continuation<? super YuanxzhSetting> continuation) {
try {
return YuanxzhSetting.parseFrom(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Nullable
@Override
public Object writeTo(YuanxzhSetting yuanxzhSetting, @NonNull OutputStream outputStream, @NonNull Continuation<? super Unit> continuation) {
try {
yuanxzhSetting.writeTo(outputStream);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
5、
RxDataStore<YuanxzhSetting> dataStore;
dataStore = new RxDataStoreBuilder<YuanxzhSetting>(BaseApplication.getContext(),
/* fileName= */ "settings.proto",
new SettingSerializer()).build();
设置
Single<YuanxzhSetting> updateResult =
dataStore.updateDataAsync(currentSettings ->
Single.just(
currentSettings.toBuilder()
.setAge(35)
.setName("yuanxzh")
.setIsMale(true)
.build()));
获取
Flowable<Integer> exampleCounterFlow =
dataStore.data().map(settings -> settings.getAge());
exampleCounterFlow.blockingFirst()