RoboSpice抛出okhttp异常

Arb*_*tur 6 java android robospice retrofit

我使用RoboSpice-Retrofit调用我的服务器REST api,直到几天前每次调用都抛出异常时,它一直没有问题,例如:

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
Run Code Online (Sandbox Code Playgroud)

依赖关系:

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'
Run Code Online (Sandbox Code Playgroud)

我怀疑基于异常,编译器有问题,但我刚刚在另一台计算机上进行了测试,在同一个项目上安装了全新的Java和Android Studio,但同样的问题仍然存在......

这个错误让我发疯了......

任何人都知道任何有用的东西吗?任何帮助都非常感谢.

编辑

MainActivity.java:

SpiceManager spiceManager = new SpiceManager(TestAPIService.class);

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

    spiceManager.start(this);

    spiceManager.execute(new TestRequest(), new RequestListener<ResponseData>() {
        ...
    });
}
Run Code Online (Sandbox Code Playgroud)

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";
    }
}
Run Code Online (Sandbox Code Playgroud)

TestAPI.java:

public interface TestAPI {
    @GET("/test")
    ResponseData getTest();
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

hee*_*nee 5

NoSuchMethodError发生的事情,因为HttpURLConnectionImpl试图在调用构造函数HttpEngine没有被定义.现在您的项目取决于:

com.octo.android.robospice:robospice-retrofit:1.4.14
Run Code Online (Sandbox Code Playgroud)

取决于:

com.squareup.retrofit:retrofit:1.6.1
Run Code Online (Sandbox Code Playgroud)

取决于两者:

com.squareup.okhttp:okhttp:2.0.0
Run Code Online (Sandbox Code Playgroud)

com.squareup.okhttp:okhttp-urlconnection:2.0.0
Run Code Online (Sandbox Code Playgroud)

从版本开始2.0.0,HttpURLConnectionImpl是在okhttp-urlconnection模块中并且HttpEngineokhttp模块中.将retrofit.client.UrlConnectionClient您的堆栈跟踪的部分正确匹配retrofit:1.6.1,但com.squareup.okhttp.internal.huc.HttpURLConnectionImpl部分不匹配okhttp-urlconnection:2.0.0; 它匹配okhttp-urlconnection:2.4.0.NoSuchMethodError实际上定义了抱怨的构造函数,okhttp:2.4.0这意味着HttpEngine类路径中存在不同的东西,很可能来自不同版本的构造函数okhttp被传递依赖项所吸引.您应该能够通过指定以下依赖项来解决问题:

compile('com.squareup.okhttp:okhttp:2.0.0') {
    force = true
}
compile('com.squareup.okhttp:okhttp-urlconnection:2.0.0') {
    force = true
}
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因无效,那么问题的解决方案仍然是获取您的版本okhttpokhttp-urlconnection同步并且版本与您的版本兼容retrofit.声明类似于上面的依赖关系,查找包含的罐子HttpURLConnectionImplHttpEngine,弄清楚他们是如何在获得拉到你的构建,并利用排除摆脱问题的传递依赖的.