Android XML I/O 输入优化

180 阅读1分钟

1.Xml分析后会使用OutputStream out进行序列化输入。

OutputStream out;
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(out, "UTF-8");
serializer.startDocument("UTF-8", true);

但是使用OutputStream 序列化会很慢。

所以优化点在OutputSream。

2.可以使用Protobuf进行优化

因为Protobuf使用了二进制法进行压缩,所以相对xml来说会快很多。

官网

  • 1.项目的root根目录添加依赖
  dependencies {
        classpath 'com.android.tools.build:gradle:3.4.2'
        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.8'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
  • 2.项目里面的build.gradle配置
apply plugin: 'com.android.application'
apply plugin: 'com.google.protobuf'

android {
 sourceSets {
        main {
            java {
                srcDir 'src/main/java'
            }
            proto {
                srcDir 'src/main/proto'
                include '**/*.proto'
            }
        }
    }
}

//构建task
protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.1.0'
    }

    generateProtoTasks {
        all().each { task ->
            task.builtins {
                remove java
            }
            task.builtins {
                java {}
                // Add cpp output without any option.
                // DO NOT omit the braces if you want this builtin to be added.
                cpp {}
            }
        }
    }
    //生成目录
    generatedFilesBaseDir = "$projectDir/src/generated"
}

dependencies {
    implementation 'com.google.protobuf:protobuf-java:3.1.0'
    implementation 'com.google.protobuf:protoc:3.1.0'
}
  • 3.在项目中添加proto文件夹和proto对应的文件

  • 4.编辑proto文件然后rebuild一下,生成类进行使用

//定义包名
option java_package="com.lg.xmlparse.bean";
//定义class名
option java_outer_classname = "ProPerson";
//对象类型
message properson{
   required int32 id = 1 ;
   required string name = 2;
   required int32 age = 3 ;
}
  • 5.使用
  ProPerson.properson.Builder personBuilder = ProPerson.properson.newBuilder();
  personBuilder.setId(12);
  personBuilder.setAge(33);
  personBuilder.setName("lee");
  ProPerson.properson person = personBuilder.build();
  File file=new File(this.getFilesDir(),"ProtoPerson.xml");
  FileOutputStream outputStream = new FileOutputStream(file);
  person.writeTo(outputStream);z

最后看一下在build里面proto生成的文件