首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >引发okhttp异常的RoboSpice

引发okhttp异常的RoboSpice
EN

Stack Overflow用户
提问于 2016-01-15 10:53:41
回答 1查看 848关注 0票数 6

我使用调用我的服务器REST,直到几天前,每个调用都抛出一个异常,直到几天前,该api才开始正常工作:

代码语言:javascript
复制
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

依赖关系:

代码语言:javascript
复制
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'

我怀疑在例外情况下编译器有问题,但我刚刚在另一台计算机上测试了Java和Android在同一项目上的新安装,但问题仍然相同……

这个错误快把我逼疯了。

有人知道什么能帮上忙吗?任何帮助都是非常感谢的。

编辑

MainActivity.java:

代码语言:javascript
复制
SpiceManager spiceManager = new SpiceManager(TestAPIService.class);

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

    spiceManager.start(this);

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

TestAPIService.java:

代码语言:javascript
复制
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:

代码语言:javascript
复制
public interface TestAPI {
    @GET("/test")
    ResponseData getTest();
}

TestRequest.java:

代码语言:javascript
复制
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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-20 00:23:41

之所以发生NoSuchMethodError,是因为HttpURLConnectionImpl试图在未定义的HttpEngine上调用构造函数。现在,您的项目依赖于:

代码语言:javascript
复制
com.octo.android.robospice:robospice-retrofit:1.4.14

哪个取决于

代码语言:javascript
复制
com.squareup.retrofit:retrofit:1.6.1

哪个取决于都是:

代码语言:javascript
复制
com.squareup.okhttp:okhttp:2.0.0

代码语言:javascript
复制
com.squareup.okhttp:okhttp-urlconnection:2.0.0

在版本2.0.0中,HttpURLConnectionImplokhttp-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。您应该能够通过指定以下依赖项来解决这个问题:

代码语言:javascript
复制
compile('com.squareup.okhttp:okhttp:2.0.0') {
    force = true
}
compile('com.squareup.okhttp:okhttp-urlconnection:2.0.0') {
    force = true
}

如果这样做不起作用,那么您的问题的解决方案仍然是让您的okhttpokhttp-urlconnection版本同步起来,并且与您的retrofit版本兼容。声明类似于上面的依赖项,找到包含HttpURLConnectionImplHttpEngine弄清楚他们是怎么被拉到你的建筑里的的jars,并使用排除消除问题的传递依赖关系。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34809462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档