3
votes

Exception lors de la création d'une nouvelle instance de OkHttp3.OkHttpClient

J'essaie d'utiliser OkHttp pour télécharger un fichier à partir d'un serveur Web dans une application Android. Après avoir créé un nouveau projet avec Android Studio (niveau d'API 28), j'ai ajouté un bouton et suis ImageView à mon activité. L'idée est de télécharger une image lorsque j'appuie sur le bouton et de l'afficher à l'écran.

J'utilise la dernière version d'OkHttp, 3.14.0.

J'ai ajouté dans le fichier AndroidManifest.xml.

J'ai essayé d'utiliser OkHttpClient exactement comme décrit dans le exemples . Voici à quoi ressemble mon code:

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) 

Quand je lance l'application et que j'appuie sur le bouton, la méthode btnClicked () est exécutée et l'application plante. L'erreur se produit lors de l'appel de OkHttpClient () , peu importe si je le place comme champ dans la classe DownloadImageAsyncTask , comme variable locale de doInBackground () code> ou en tant que champ dans la classe ManActivity .

J'ai également essayé d'utiliser le Builder ( new OkHttpClient.Builder (). build () ) pour initialiser l'objet mais avec le même résultat.

Voici la trace de la pile:

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()
    }
}


0 commentaires

3 Réponses :


2
votes

Après avoir essayé tout ce qui m'est venu à l'esprit, j'ai essayé d'utiliser une ancienne version d'OkHttp.

En utilisant à la place OkHttp: 2.7.2 , mon code fonctionne comme prévu.

Je viens de tester également Okhttp3: 3.12.2 et cela résout également le problème.

Fait intéressant, OkHttp3: 3.12.2 a été publié un jour après OkHttp3: 3.14.0 ( https://github.com/square/okhttp/releases )


0 commentaires

5
votes

OkHttp 3.13+ nécessite Java 8+ ou Android 5+. Je pense que vous avez rencontré une situation dans laquelle un lambda Java 8 n'est pas attendu par le moteur d'exécution ART.

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

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

Vous réussirez probablement à mettre à jour votre build.gradle.

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;
}

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


2 commentaires

Merci pour votre réponse, cela a résolu mon problème! Mais en fait, j'ai dû exécuter la commande clean project avant que les modifications du fichier build.gradle ne soient appliquées.


Merci beaucoup Jesse. Tu as sauvé ma journée



1
votes

Voici la réponse pourquoi cela fonctionne avec le Okhttp3: 3.12.2 :

Le tableau de bord de distribution de Google montre qu'environ 11% des appareils qui ont visité le Play Store en octobre 2018 exécutaient Android 4.x. Nous avons créé une branche, OkHttp 3.12.x, pour prendre en charge ces appareils. Si nous rencontrons des bogues graves ou des problèmes de sécurité, nous rétroporterons les correctifs et la version. Nous prévoyons de maintenir cette succursale jusqu'au 31 décembre 2020.

Source: https: // medium .com / square-corner-blog / okhttp-3-13-requiert-android-5-818bb78d07ce


0 commentaires