2016-01-15 20 views
6

io uso RoboSpice-retrofit per chiamare il mio server API REST che ha lavorato senza problemi fino a pochi giorni fa, quando ogni singola chiamata ora genera un'eccezione, Esempio:RoboSpice gettando okhttp eccezioni

D/Retrofit: java.lang.NoSuchMethodError: No direct method <init>(Lcom/squareup/okhttp/OkHttpClient;Lcom/squareup/okhttp/Request;ZZZLcom/squareup/okhttp/Connection;Lcom/squareup/okhttp/internal/http/RouteSelector;Lcom/squareup/okhttp/internal/http/RetryableSink;Lcom/squareup/okhttp/Response;)V in class Lcom/squareup/okhttp/internal/http/HttpEngine; or its super classes (declaration of 'com.squareup.okhttp.internal.http.HttpEngine' appears in /data/app/com.company.app.customerapp-1/base.apk) 
      at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.newHttpEngine(HttpURLConnectionImpl.java:362) 
      at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.initHttpEngine(HttpURLConnectionImpl.java:312) 
      at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:377) 
      at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497) 
      at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:73) 
      at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:38) 
      at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:321) 
      at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240) 
      at java.lang.reflect.Proxy.invoke(Proxy.java:393) 
      at $Proxy0.getTest(Unknown Source) 
      at com.adoperator.tidyapp.TestActivity$TestRequest.loadDataFromNetwork(TestActivity.java:67) 
      at com.adoperator.tidyapp.TestActivity$TestRequest.loadDataFromNetwork(TestActivity.java:54) 
      at com.octo.android.robospice.request.CachedSpiceRequest.loadDataFromNetwork(CachedSpiceRequest.java:48) 
      at com.octo.android.robospice.request.DefaultRequestRunner.processRequest(DefaultRequestRunner.java:150) 
      at com.octo.android.robospice.request.DefaultRequestRunner$1.run(DefaultRequestRunner.java:217) 
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423) 
      at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
      at java.lang.Thread.run(Thread.java:818) 
D/Retrofit: ---- END ERROR 

dipendenze:

compile 'com.octo.android.robospice:robospice:1.4.14' 
compile 'com.octo.android.robospice:robospice-cache:1.4.14' 
compile 'com.octo.android.robospice:robospice-retrofit:1.4.14' 

ho il sospetto fondato sulla deroga che c'è qualcosa di sbagliato con il compilatore, ma ho appena provato su un altro computer con una nuova installazione di Java e Android Studio sullo stesso progetto, ma stessi problemi ancora ...

Questo errore mi sta facendo impazzire ...

Qualcuno sa tutto ciò che potrebbe essere d'aiuto? Qualsiasi aiuto è molto apprezzato.

EDIT

MainActivity.java:

SpiceManager spiceManager = new SpiceManager(TestAPIService.class); 

protected void onStart() { 
    super.onStart(); 

    spiceManager.start(this); 

    spiceManager.execute(new TestRequest(), new RequestListener<ResponseData>() { 
     ... 
    }); 
} 

TestAPIService.java:

public class TestAPIService extends RetrofitGsonSpiceService { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     addRetrofitInterface(TestAPI.class); 
    } 

    @Override 
    protected String getServerUrl() { 
     return "http://192.168.0.2"; 
    } 
} 

TestAPI.java:

public interface TestAPI { 
    @GET("/test") 
    ResponseData getTest(); 
} 

TestRequest.java:

public class TestRequest extends RetrofitSpiceRequest<ResponseData, TestAPI> { 

    public TestRequest() { 
     super(ResponseData.class, TestAPI.class); 
    } 


    @Override 
    public ResponseData loadDataFromNetwork() throws Exception { 
     ResponseData response; 

     try { 
      response = getService().getTest(); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
      throw e; 
     } 

     return response; 
    } 
} 
+0

per favore, inserisci il tuo codice, quando stai configurando robospice. – Alexander

+0

Ho aggiunto il mio codice, ho pensato, non ho cambiato nulla, gli errori sono venuti dal nulla. – Arbitur

+0

per favore, indicami dove sono le righe 67 e 54 in 'TestActivity.java' – Alexander

risposta

5

Il NoSuchMethodError sta accadendo perché HttpURLConnectionImpl sta cercando di richiamare un costruttore su HttpEngine che non è definito. Ora il vostro progetto dipende da:

com.octo.android.robospice:robospice-retrofit:1.4.14 

Quali depends on:

com.squareup.retrofit:retrofit:1.6.1 

Quali depends on entrambi:

com.squareup.okhttp:okhttp:2.0.0 

and

com.squareup.okhttp:okhttp-urlconnection:2.0.0 

Come di Versio n 2.0.0, HttpURLConnectionImpl è nel modulo okhttp-urlconnection e HttpEngine è nel modulo okhttp. La porzione retrofit.client.UrlConnectionClient della traccia stack corrisponde a retrofit:1.6.1, ma la parte com.squareup.okhttp.internal.huc.HttpURLConnectionImpl non corrisponde a okhttp-urlconnection:2.0.0; corrisponde a okhttp-urlconnection:2.4.0. Il costruttore di cui si lamenta il numero NoSuchMethodError è in effetti definito in okhttp:2.4.0, il che significa che esiste un diverso HttpEngine sul classpath, molto probabilmente da una versione diversa di okhttp che viene attivata da una dipendenza transitiva.Dovreste essere in grado di risolvere il problema specificando le seguenti dipendenze:

compile('com.squareup.okhttp:okhttp:2.0.0') { 
    force = true 
} 
compile('com.squareup.okhttp:okhttp-urlconnection:2.0.0') { 
    force = true 
} 

Se questo non funziona per qualsiasi motivo, la soluzione al vostro problema sarà ancora per ottenere il vostro versioni di okhttp e okhttp-urlconnection sincronizzati e a una versione compatibile con la tua versione di retrofit. Dichiarare le dipendenze come sopra, trovare i vasi che contengono HttpURLConnectionImpl e HttpEngine, figure out how they're getting pulled in to your build e utilizzare exclusions per sbarazzarsi delle dipendenze transitive problematiche.

+0

Grazie mille! Risposta davvero ben scritta e ha funzionato e buona ricerca! – Arbitur

+0

Proprio così strano che ho dovuto aggiungerli manualmente perché funzionava solo una settimana fa e non ho cambiato il mio file gradle: S – Arbitur

+0

Contento di aver potuto aiutare. Anche se non hai cambiato la tua build, questo genere di cose può ancora accadere se una delle tue dipendenze cambia il loro pom.xml, o se una dipendenza ha un intervallo di versione e viene rilasciata una nuova versione applicabile. – heenenee