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'

以上。
格式有点乱,凑合一下,能解决问题即是好的。
网友评论