2017-10-21 99 views
1

J'essaie de résoudre un problème où Retrofit 2 renvoie null en réponse. La chose intéressante est que dans l'émulateur tout fonctionne bien, les données sont reçues et affichées, mais quand je construis l'APK, la même chose se bloque avec l'exception NullPointerException. J'ai commenté la ligne où cela arrive.Retrofit 2 renvoie null en production

Mes dépendances build.gradle:

compile 'com.squareup.retrofit2:retrofit:2.3.0' 
compile 'io.reactivex.rxjava2:rxjava:2.1.3' 
compile 'io.reactivex.rxjava2:rxandroid:2.0.1' 
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' 
compile 'com.squareup.retrofit2:converter-gson:2.3.0' 

Initialiser Rénovation:

retrofit = new Retrofit.Builder() 
     .baseUrl(<url>) 
     .addConverterFactory(GsonConverterFactory.create()) 
     .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
     .build(); 

Interface:

@GET(<url>) 
Flowable<DataResponse> getDataFromApi(@Query("offset") int offset, @Query("limit") int limit); 

appel API:

retrofit 
    .getDataFromApi(0, 10) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(new Subscriber<DataResponse>() { 
     @Override 
     public void onSubscribe(Subscription s) { 
      s.request(Long.MAX_VALUE); 
     } 

     @Override 
     public void onNext(DataResponse dataResponse) { 
      // HERE I GET NULL IN PRODUCTION 
     } 

DataResponse POJO:

public class ServicesResponse { 
    private List<Item> items; 

    public List<Item> getItems() { 
    return items; 
    } 
} 

ProGuard. J'ai essayé plusieurs choses, mais toujours pas de chance. Il ressemble actuellement à ceci:

-dontwarn retrofit2.** 
-keep class javax.annotation.Nullable 
-keep interface javax.annotation.Nullable 
-keep class retrofit2.** { *; } 
-keep class com.squareup.okhttp3.** { *; } 
-keep interface com.squareup.okhttp3.** { *; } 
-keepattributes Signature 
-keepattributes Exceptions 
-keepclasseswithmembers class * { 
    @retrofit2.http.* <methods>; 
} 
-keepclasseswithmembers interface * { 
    @retrofit2.http.* <methods>; 
} 

Merci pour l'aide :)

+0

Pouvez-vous publier une trace de pile NPE. Utilisez-vous ProGuard (c'est généralement la cause de problèmes comme celui-ci lorsque le comportement diffère dans la version release)? –

+0

Oui, j'ai oublié le ProGuard. J'ai mis à jour le message original. La trace de pile est fondamentalement la nullpointerexception quand j'essaye de faire n'importe quoi avec la réponse. – Oleg

+0

- Gardez la classe publique your.package.to.models. ** {*;} –

Répondre

0

Je garde toujours les classes de modèles utilisés par les faux-fuyants Rénovation de. Sinon AFAIK Gson ne peut pas sérialiser/désérialiser Modèle:

-keep public class your.package.to.models.** {*;} 
+0

Oui, c'était ça, merci beaucoup! J'ai effectivement supprimé tous les autres trucs liés à la rétrofit, aux annotations okhttp3 et javax, juste à gauche -dontwarn javax.annotation. **. Tout semble marcher. – Oleg