environment:kotlin 1.2.51/gson 2.4/okhttp 3.10 retrofit 2.4
Retrofit and okhttp retrieve json data from WebAPI and store it in data class in converter.
In debug/release mode, it is successfully stored on a member of the data class, but it is not successfully stored on an APK signed by the Generate Signed APK in Android Studio.
Here's the code:
class ServiceGenerator{
US>companion object {
create (auth:Boolean=false):Router {
valclient=httpClientBuilder(auth)
valgson=GsonBuilder()
.setFieldNamingPolicy (FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create()
valueAdapter=RxJava2CallAdapterFactory.createAsync()
valbaseUrl = LocalConfigManager.getProperty (ConfigConstants.KEY_BASE_URL)
return Retrofit.Builder()
.baseUrl (baseUrl!!)
.addCallAdapterFactory(adapter)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build()
.create (Router::class.java)
}
private fun httpClientBuilder (auth:Boolean):OkHttpClient{
valclient=OkHttpClient.Builder()
client.addNetworkInterceptor(HeaderInterceptor())
if(auth)
client.addNetworkInterceptor (AuthorizationHeaderInterceptor())
client.protocols(Arrays.asList(Protocol.HTTP_1_1))
if(BuildConfig.DEBUG) {
val logger = HttpLoggingInterceptor()
// logger.level = HttpLoggingInterceptor.Level.HEADERS
logger.level = HttpLoggingInterceptor.Level.BODY
client.addNetworkInterceptor (logger)
}
return client.build()
}
}
interface Router {
@ GET("/api/v2/settings")
fun settings():Observable<Response<Foo>>
}
data class Settings (value version: Int, @SerializedName("settings") val details: Setting)
US>data class Setting(
values —List<Category>=listOf(),
val personalEntries —List<PersonalEntry>)
From
ServiceGenerator
.create()
.beaconContents()
.compose(bindToLifecycle())
.observeOn (AndroidScheduler.mainThread())
.subscribe(
{
if(it.isSuccessful){
it.body()?.let {data->
Log.d(TAG, Integer.toString(data.version))<=0 for signed APK.2 in debug/release mode.
if(data.beaconContents==null)<=Null on signed APK.A signature APK stores data in an array.
Log.e(TAG, "beacon contents is null.")
contentModel?.save(data.beaconContents)
}
} else {
When(it.code()){
404 - > Log.e (TAG, "not found.")
}
}
},
{
Log.e(TAG, it.localizedMessage)
})
API Retrieved json Data
{"version":2, "settings":{"categories":[{"id":1, "disp_no":1, "...}
Among the above codes, if you log in the caller subscribe, the signature APK will have version==0 and categories==null.
Does anyone have a similar experience and know how to solve it?
android kotlin retrofit
It's solved.
The reason was that code compression was enabled.I was able to parse successfully by specifying @SerializedName
© 2024 OneMinuteCode. All rights reserved.