web-dev-qa-db-fra.com

La modification est impossible pour créer un adaptateur d'appel

Ceci est mon interface utilisateur

 @GET(Constants.Api.URL_LOGIN)
    String loginUser(@Field("email") String email, @Field("password") String pass, @Field("secret") String secret, @Field("device_id") String deviceid, @Field("pub_key") String pubkey, @Field("device_name") String devicename);

Dans l'activité que j'appelle 

retrofit = new Retrofit.Builder()
                .baseUrl(Constants.Api.URL_BASE)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
service = retrofit.create(UserService.class);
String status = service.loginUser(loginedt.getText().toString(), passwordedt.getText().toString(), secret, device_id, pub_key, device_name);

Cela crée une exception 

Java.lang.IllegalArgumentException: Unable to create call adapter for class Java.lang.String
    for method UserService.loginUser

Qu'est-ce que je fais mal?

Gradle:

compile 'com.squareup.retrofit:retrofit:2.+'
compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta1'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta1'
8
androidAnonDev

Puisque vous avez inclus addCallAdapterFactory(RxJavaCallAdapterFactory.create()), vous envisagez d’utiliser Observable pour gérer vos appels. Dans votre interface, donnez explicitement la Observable paramétrée au lieu d'une Call

@GET(Constants.Api.URL_LOGIN)
    Observable<String> loginUser(@Field("email") String email, @Field("password") String pass, @Field("secret") String secret, @Field("device_id") String deviceid, @Field("pub_key") String pubkey, @Field("device_name") String devicename);

et vos méthodes service créent ensuite des observables auxquels vous pouvez vous abonner ou les utiliser comme point de départ d'un pipeline observable.

Observable<String> status = service.loginUser(loginedt.getText().toString(), passwordedt.getText().toString(), secret, device_id, pub_key, device_name);
status.subscribe(/* onNext, onError, onComplete handlers */);
13
iagreen

Aleksei, si vous avez besoin de la solution la plus simple pour obtenir le résultat String de la bibliothèque Retrofit, vous devez effectuer plusieurs appels:

  1. Au début, Gradle dépendecies:

    compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
    compile 'com.squareup.retrofit2:converter-scalars:2.0.0-beta4'
    
  2. Votre interface utilisateur modifiée

    @GET(Constants.Api.URL_LOGIN)
    Call< String> loginUser(@Field("email") String email, @Field("password") String pass, @Field("secret") String secret, @Field("device_id") String deviceid, @Field("pub_key") String pubkey, @Field("device_name") String devicename);
    
  3. Code de création du client de service:

    static UserService SERVICE_INSTANCE = (new Retrofit.Builder()
            .baseUrl(Constants.Api.URL_BASE)
            .addConverterFactory(ScalarsConverterFactory.create())
            .build()).create(UserService.class);    
    
  4. Appeler la demande:

    SERVICE_INSTANCE.loginUser(*all your params*).execute().body();
    

J'espère que la solution est claire et montre une approche simple de réception de chaîne. Si vous avez besoin d’un autre analyseur de données, consultez la liste des convertisseurs ici Retrofit CONVERTERS .

0
Kirill Vashilo