创建OkHttp3.OkHttpClient的新实例时发生异常

时间:2019-03-15 20:47:56

标签: java android okhttp okhttp3

我正在尝试使用OkHttp从Android应用程序中的网络服务器下载文件。在使用Android Studio(API级别28)创建新项目之后,我向我的Activity添加了一个按钮,并将其设为ImageView。我的想法是当我按下按钮并在屏幕上显示图像时下载图像。

我正在使用最新版本的OkHttp 3.14.0。

我在AndroidManifest.xml文件中添加了<uses-permission android:name="android.permission.INTERNET"/>

我尝试完全按照examples中的描述使用OkHttpClient。这是我的代码:

public class MainActivity extends AppCompatActivity {

    ... // onCreate method

    public void btnClicked(View view) {
        new DownloadImageAsyncTask().execute("https://link.to/image.jpg");
    }

    public class DownloadImageAsyncTask extends AsyncTask<String, Void, Bitmap> {

        OkHttpClient client = new OkHttpClient();

        ... // override doInBackground()
    }
}

当我运行该应用程序并按下按钮时,将执行btnClicked()方法,该应用程序将崩溃。无论将OkHttpClient()类放置为DownloadImageAsyncTask类中的字段,doInBackground()方法的局部变量还是{{1}中的字段,都将发生错误。 }类。

我也尝试过使用Builder(ManActivity)初始化对象,但结果相同。

这是堆栈跟踪:

new OkHttpClient.Builder().build()

3 个答案:

答案 0 :(得分:1)

尝试完所有想到的内容后,我尝试使用旧版本的OkHttp。

使用E/AndroidRuntime: FATAL EXCEPTION: main Process: com.myapp.httpstuff, PID: 17796 java.lang.IllegalStateException: Could not execute method for android:onClick at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:390) at android.view.View.performClick(View.java:6597) at android.view.View.performClickInternal(View.java:6574) at android.view.View.access$3100(View.java:778) at android.view.View$PerformClick.run(View.java:25885) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385) at android.view.View.performClick(View.java:6597)  at android.view.View.performClickInternal(View.java:6574)  at android.view.View.access$3100(View.java:778)  at android.view.View$PerformClick.run(View.java:25885)  at android.os.Handler.handleCallback(Handler.java:873)  at android.os.Handler.dispatchMessage(Handler.java:99)  at android.os.Looper.loop(Looper.java:193)  at android.app.ActivityThread.main(ActivityThread.java:6669)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)  Caused by: java.lang.BootstrapMethodError: Exception from call site #4 bootstrap method at okhttp3.internal.Util.<clinit>(Util.java:87) at okhttp3.internal.Util.immutableList(Util.java:234) at okhttp3.OkHttpClient.<clinit>(OkHttpClient.java:124) at com.myapp.httpstuff.MainActivity$DownloadImageAsyncTask.<init>(MainActivity.java:31) at com.myapp.httpstuff.MainActivity.btnClicked(MainActivity.java:26) at java.lang.reflect.Method.invoke(Native Method)  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)  at android.view.View.performClick(View.java:6597)  at android.view.View.performClickInternal(View.java:6574)  at android.view.View.access$3100(View.java:778)  at android.view.View$PerformClick.run(View.java:25885)  at android.os.Handler.handleCallback(Handler.java:873)  at android.os.Handler.dispatchMessage(Handler.java:99)  at android.os.Looper.loop(Looper.java:193)  at android.app.ActivityThread.main(ActivityThread.java:6669)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)  Caused by: java.lang.ClassCastException: Bootstrap method returned null at okhttp3.internal.Util.<clinit>(Util.java:87)  at okhttp3.internal.Util.immutableList(Util.java:234)  at okhttp3.OkHttpClient.<clinit>(OkHttpClient.java:124)  at com.myapp.httpstuff.MainActivity$DownloadImageAsyncTask.<init>(MainActivity.java:31)  at com.myapp.httpstuff.MainActivity.btnClicked(MainActivity.java:26)  at java.lang.reflect.Method.invoke(Native Method)  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)  at android.view.View.performClick(View.java:6597)  at android.view.View.performClickInternal(View.java:6574)  at android.view.View.access$3100(View.java:778)  at android.view.View$PerformClick.run(View.java:25885)  at android.os.Handler.handleCallback(Handler.java:873)  at android.os.Handler.dispatchMessage(Handler.java:99)  at android.os.Looper.loop(Looper.java:193)  at android.app.ActivityThread.main(ActivityThread.java:6669)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)  代替,我的代码按预期工作。

我也刚刚测试过OkHttp:2.7.2,这也解决了这个问题。

有趣的是,Okhttp3:3.12.2OkHttp3:3.12.2https://github.com/square/okhttp/releases)的第二天被释放

答案 1 :(得分:1)

OkHttp 3.13+需要Java 8+或Android 5+。我认为您遇到的情况是ART运行时不期望Java 8 lambda。

https://android.googlesource.com/platform/art/+/master/runtime/interpreter/interpreter_common.cc#1399

Handle<mirror::Object> object(hs.NewHandle(result.GetL()));
if (UNLIKELY(object.IsNull())) {
  // This will typically be for LambdaMetafactory which is not supported.
  ThrowClassCastException("Bootstrap method returned null");
  return nullptr;
}

您可能会成功更新build.gradle。

android { 
  compileOptions { 
    targetCompatibility = "8"
    sourceCompatibility = "8"
   }
 }

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

答案 2 :(得分:1)

以下是它与Okhttp3:3.12.2配合使用的答案:

Google的分发仪表板显示,2018年10月访问Play商店的设备中约有11%运行的是Android 4.x.我们创建了一个分支OkHttp 3.12.x,以支持这些设备。如果遇到任何严重的错误或安全问题,我们将向后移植这些修补程序并发布。我们计划将该分支机构保留到2020年12月31日。

来源:https://medium.com/square-corner-blog/okhttp-3-13-requires-android-5-818bb78d07ce