2015-09-05 17 views
8

Questo è il mio UserService interfacciaRetrofit non è in grado di creare adattatore chiamata

@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); 

Nell'attività sto chiamando

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); 

Questo crea un'eccezione

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

Che cosa sto facendo sbagliato?

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' 

risposta

13

Dal momento che avete incluso addCallAdapterFactory(RxJavaCallAdapterFactory.create()), si sta cercando di usare Observable 's per gestire le chiamate. Nell'interfaccia, esplicitamente dare il parametrizzato Observable invece di un 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); 

e quindi i vostri service metodi creano osservabili per te, che è possibile abbonarsi o utilizzare come l'inizio di una condotta osservabile.

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

Aleksei, se avete bisogno la soluzione più semplice per ottenere il risultato String dalla libreria di retrofit, che si deve fare questo diverse chiamate:

  1. In un primo momento, Gradle dependecies:

    compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4' 
    compile 'com.squareup.retrofit2:converter-scalars:2.0.0-beta4' 
    
  2. tuo modificata UserService interfaccia

    @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. Service codice di creazione del client:

    static UserService SERVICE_INSTANCE = (new Retrofit.Builder() 
         .baseUrl(Constants.Api.URL_BASE) 
         .addConverterFactory(ScalarsConverterFactory.create()) 
         .build()).create(UserService.class);  
    
  4. chiamata di richiesta:

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

spero, la soluzione è chiara e mostra semplice stringa ricevere approccio. Se hai bisogno di un altro parser di dati, per favore, dai un'occhiata all'elenco degli inversori qui Retrofit CONVERTERS.

Problemi correlati