与 OkHttp 连接的 Android http 不工作

Posted

技术标签:

【中文标题】与 OkHttp 连接的 Android http 不工作【英文标题】:Android http connecting with OkHttp Dont work 【发布时间】:2015-03-23 08:36:42 【问题描述】:

我正在尝试使用 OkHttp,但它一直在崩溃。有人可以快速查看一下,看看你是否知道发生了什么。谢谢。

原木猫:

01-24 08:34:46.952: E/androidRuntime(31953): FATAL EXCEPTION: OkHttp Dispatcher
01-24 08:34:46.952: E/AndroidRuntime(31953): java.lang.NoClassDefFoundError: okio.Okio
01-24 08:34:46.952: E/AndroidRuntime(31953):    at com.squareup.okhttp.internal.http.HttpConnection.<init>(HttpConnection.java:87)
01-24 08:34:46.952: E/AndroidRuntime(31953):    at com.squareup.okhttp.Connection.upgradeToTls(Connection.java:272)
01-24 08:34:46.952: E/AndroidRuntime(31953):    at com.squareup.okhttp.Connection.connect(Connection.java:158)
01-24 08:34:46.952: E/AndroidRuntime(31953):    at com.squareup.okhttp.Connection.connectAndSetOwner(Connection.java:174)
01-24 08:34:46.952: E/AndroidRuntime(31953):    at com.squareup.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:120)
01-24 08:34:46.952: E/AndroidRuntime(31953):    at com.squareup.okhttp.internal.http.RouteSelector.next(RouteSelector.java:131)
01-24 08:34:46.952: E/AndroidRuntime(31953):    at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:312)
01-24 08:34:46.952: E/AndroidRuntime(31953):    at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:235)
01-24 08:34:46.952: E/AndroidRuntime(31953):    at com.squareup.okhttp.Call.getResponse(Call.java:262)
01-24 08:34:46.952: E/AndroidRuntime(31953):    at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:219)
01-24 08:34:46.952: E/AndroidRuntime(31953):    at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:192)
01-24 08:34:46.952: E/AndroidRuntime(31953):    at com.squareup.okhttp.Call.access$100(Call.java:34)
01-24 08:34:46.952: E/AndroidRuntime(31953):    at com.squareup.okhttp.Call$AsyncCall.execute(Call.java:156)
01-24 08:34:46.952: E/AndroidRuntime(31953):    at com.squareup.okhttp.internal.NamedRunnable.run(NamedRunnable.java:33)
01-24 08:34:46.952: E/AndroidRuntime(31953):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
01-24 08:34:46.952: E/AndroidRuntime(31953):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
01-24 08:34:46.952: E/AndroidRuntime(31953):    at java.lang.Thread.run(Thread.java:841)

这是我尝试使用的代码示例。它来自在线教程(teamtreehouse.com) Java 代码:

OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url(forecastUrl)
                    .build();

            Call call = client.newCall(request);
            call.enqueue(new Callback() 
                @Override
                public void onFailure(Request request, IOException e) 
                    runOnUiThread(new Runnable() 
                        @Override
                        public void run() 
                            toggleRefresh();
                        
                    );
                    alertUserAboutError();
                

                @Override
                public void onResponse(Response response) throws IOException 
                    runOnUiThread(new Runnable() 
                        @Override
                        public void run() 
                            toggleRefresh();
                        
                    );

                    try 
                        String jsonData = response.body().string();
                        Log.v(TAG, jsonData);
                        if (response.isSuccessful()) 
                            mCurrentWeather = getCurrentDetails(jsonData);
                            runOnUiThread(new Runnable() 
                                @Override
                                public void run() 
                                    updateDisplay();
                                
                            );
                         else 
                            alertUserAboutError();
                        
                    
                    catch (IOException e) 
                        Log.e(TAG, "Exception caught: ", e);
                    
                    catch (JSONException e) 
                        Log.e(TAG, "Exception caught: ", e);
                    
                
            );

【问题讨论】:

【参考方案1】:

OkHttp 需要 Okio,OkHttp 使用它来实现快速 I/O 和可调整大小的缓冲区。您可以下载 Okio(最新 JAR)here。

安卓毕业:compile 'com.squareup.okio:okio:1.6.0'

马文

<dependency>
    <groupId>com.squareup.okio</groupId>
    <artifactId>okio</artifactId>
    <version>1.6.0</version>
</dependency>

for version checks; github okio

【讨论】:

【参考方案2】:

似乎对 OkHTTP 的 1.0 库有依赖。这是一个已知的报告。您可以通过以下链接关注它:

https://github.com/square/okhttp/issues/870

您还应该在项目库中包含library 1.0。

【讨论】:

以上是关于与 OkHttp 连接的 Android http 不工作的主要内容,如果未能解决你的问题,请参考以下文章

TCP连接与OKHTTP复用连接池

Okhttp

OkHttp

Android应用程序崩溃okhttp3 HTTP FAILED:javax.net.ssl.SSLException:读取错误:系统调用期间I/O错误,软件导致连接中止

okhttp 3.10连接复用原理

OKHttp使用简单介绍