2016-12-21 1 views
2

Je recherche cette erreur Internet entier, mais encore, une seule entrée stackoverflow sans réponse ou commentaire. J'essaie d'utiliser Retrofit 2. C'est la première fois que je l'utilise. Voici mes dépendances:Rénovation 2: Aucune méthode virtuelle newJsonReader (Ljava/io/Reader;) NoSuchMethodException

compile 'com.squareup.retrofit2:retrofit:2.1.0' 
compile 'com.squareup.retrofit2:converter-gson:2.1.0' 
compile 'com.google.code.gson:gson:2.6.2' 

J'ai exclu toutes les bibliothèques OkHttp car Retrofit l'utilise déjà.

Ceci est mon interface demande:

public interface LoginService { 
    @POST(HTTPService.AUTHENTICATIO_URL) 
    Call<User> login(); 
} 

suivant: mon générateur de service:

public class ServiceGenerator { 

public static final String API_BASE_URL = HTTPService.BASE_URL; 

private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 

private static Retrofit.Builder builder = 
     new Retrofit.Builder() 
       .baseUrl(API_BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()); 

public static <S> S createService(Class<S> serviceClass, String username, String password, String roleId) { 
    if (username != null && password != null) { 
     String credentials = username+":"+password+":"+roleId; 
     final String basic = 
       "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP); 
     httpClient.addInterceptor(chain -> { 
      Request original = chain.request(); 

      Request.Builder requestBuilder = original.newBuilder() 
        .header("Authorization", basic) 
        .header("Accept", "application/json") 
        .method(original.method(), original.body()); 

      Request request = requestBuilder.build(); 
      return chain.proceed(request); 
     }); 
    } 

    OkHttpClient client = httpClient.build(); 
    Retrofit retrofit = builder.client(client).build(); 
    return retrofit.create(serviceClass); 
    } 
} 

Et suivant: où je fais la demande:

@Override 
public void loadData(DataSource.LoadJsonCallback loadJsonCallback) { 
    String login = mUser.getLogin(); 
    String password = mUser.getPassword(); 
    LoginService loginService = 
      ServiceGenerator.createService(LoginService.class, login, password, ""); 
    Call<User> call = loginService.login(); 
    String a = call.request().url().toString(); 
    call.enqueue(new Callback<User>() { 
     @Override 
     public void onResponse(Call<User> call, Response<User> response) { 
      try { 
       loadJsonCallback.onTasksLoaded(response.body()); 
       User a = response.body(); 
       mUser = getDataFromJson(""); 
       if (mUser != null) { 
        mUser.setPassword(password); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
     @Override 
     public void onFailure(Call<User> call, Throwable t) { 
      loadJsonCallback.onDataNotAvailable(t.getMessage()); 
     } 
    }); 

} 

Alors, je reçois cette exception, que je ne trouve nulle part:

java.lang.NoSuchMethodError: No virtual method newJsonReader(Ljava/io/Reader;)Lcom/google/gson/stream/JsonReader; in class Lcom/google/gson/Gson; or its super classes (declaration of 'com.google.gson.Gson' appears in /data/app/org.ucomplex.ucomplex-2/base.apk) 

Nous vous remercions de votre aide.

+0

J'ai vu quelques questions à ce sujet. L'erreur implique que le code est lié à une ancienne version de Gson. Tes dépendances me vont bien. Étiez-vous déjà en train d'utiliser une ancienne version de Gson? Avez-vous essayé de nettoyer votre projet et de le reconstruire? – iagreen

+0

@iagreen, lol c'était tout pour moi: D, tu es l'homme! –

+0

Malheureusement, n'a pas aidé. – Sermilion

Répondre

2

je commencé à utiliser les versions les plus récentes:

compile 'com.google.code.gson:gson:2.7' 
compile 'com.squareup.retrofit2:retrofit:2.2.0' 
compile 'com.squareup.retrofit2:converter-gson:2.2.0' 

Et l'erreur a disparu.