美文网首页
android protobuf ProtoConverter

android protobuf ProtoConverter

作者: Chungo | 来源:发表于2018-11-23 17:40 被阅读0次

proobuf 无法解析问题!!!!!!!!!

        最近使用 Retrofit+Rxjava 解析proobuf 数据流,遇到空指针问题。一直没有解决,网上很少有这类答案。断断续续困扰了我几个月。今天刚好有空,跟了一下这个问题,找到了原因。分享给需要有帮助的朋友。如果你使用的版本是protobuf3.0以上版本,那估计很大概率会遇到和我一样的问题。

Throwable=java.lang.NullPointerException

两种解决方式。

1,不使用Retrofit 解析。即不用 addConverterFactory(ProtoConverterFactory.create()) 。

处理方式:

@Headers({Api.HEADER_KEY + ":" + Api.REQUEST_AD})

 @POST("xxxxx")

Observable<ResponseBody> getAdBaidu(@QueryMap Map<String, String> map);


直接返回okhttp的   ResponseBody 。 然后在

数据处理的地方手动解析。这是以前规避这个问题的妥协方案

第二种:.addConverterFactory(ProtoConverterFactory.create()) 解析

如果你是上面这么添加的ProtoConverterFactory。那么大概率是解析不出来的。

注意两点:

1,使用Proto里面 的类作为返回。如图:

原因也很简单,解析的时候解析器会去判断是否实现或则继承了MessageLiteOrBuilder

MessageLite来至这里

public interface MessageLiteextends MessageLiteOrBuilder

2,必须添加 反序列化的注册表 ExtensionRegistryLite。

所以,如果你是 .addConverterFactory(ProtoConverterFactory.create()) ,那是解析不出来的。因为create()是创建的一个null的注册表

public static ProtoConverterFactory create() {

return new ProtoConverterFactory((ExtensionRegistryLite)null);

}

这样改:

mRetrofit =new Retrofit.Builder()

.baseUrl(Api.FEEDS_DOMAIN)

.client(mClient)

.addConverterFactory(ProtoConverterFactory.createWithRegistry(ExtensionRegistryLite.newInstance()))

.addConverterFactory(GsonConverterFactory.create())

.addCallAdapterFactory(RxJava2CallAdapterFactory.create())

.build();

拿走不谢!

最后,我使用的版本是:

//配置protoc编译器

protoc {

artifact ='com.google.protobuf:protoc:3.6.0'

}

-------------------------------------------------------------------------------------------------------

compile'com.squareup.retrofit2:retrofit:2.4.0'

compile'com.squareup.retrofit2:converter-gson:2.4.0'

compile'com.squareup.retrofit2:converter-protobuf:2.4.0'

compile'com.google.protobuf:protobuf-java:3.6.0'

compile'com.squareup.retrofit2:adapter-rxjava2:2.4.0'

--------------------------------------------------------------------------------------------

classpath'com.google.protobuf:protobuf-gradle-plugin:0.8.7'

以上。

格式有点乱,凑合一下,能解决问题即是好的。

相关文章

网友评论

      本文标题:android protobuf ProtoConverter

      本文链接:https://www.haomeiwen.com/subject/jjajqqtx.html