Исключение при создании нового экземпляра OkHttp3.OkHttpClient - PullRequest
1 голос
/ 15 марта 2019

Я пытаюсь использовать OkHttp для загрузки файла с веб-сервера в приложении Android. После создания нового проекта с Android Studio (уровень API 28) я добавил кнопку и теперь в моей активности активен ImageView. Идея состоит в том, чтобы загрузить изображение, когда я нажимаю кнопку и показываю его на экране.

Я использую последнюю версию OkHttp, 3.14.0.

Я добавил <uses-permission android:name="android.permission.INTERNET"/> в файл AndroidManifest.xml.

Я пытался использовать 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() или как поле в классе ManActivity.

Я также использовал построитель (new OkHttpClient.Builder().build()) для инициализации объекта, но с тем же результатом.

Вот трассировка стека:

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) 

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

Попробовав все, что мне пришло в голову, я попытался использовать более старую версию OkHttp.

Используя OkHttp:2.7.2, мой код работает как положено.

Я только что проверил Okhttp3:3.12.2, и это также исправляет проблему.

Интересно, что OkHttp3:3.12.2 был выпущен на следующий день после OkHttp3:3.14.0 (https://github.com/square/okhttp/releases)

1 голос
/ 16 марта 2019

OkHttp 3.13+ требует Java 8+ или Android 5+. Я думаю, что вы столкнулись с ситуацией, когда лямбда-версия Java 8 не ожидается во время выполнения ART.

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

...