J'utilise la bibliothèque Picasso dans mon projet pour charger des images et les mettre en cache. Cela fonctionne bien sans aucun problème. Cependant, lorsque j'essaie d'utiliser la bibliothèque OkHttp pour effectuer une communication de données avec mon serveur (communication JSON), Picasso lève des exceptions.
J'utilise les pots suivants: okhttp-2.0.0-RC2, okio-1.0.0, picasso-2.2.0. Lorsque j'exécute mon projet après avoir ajouté ces pots, il se bloque avec les éléments suivants:
06-12 11:13:15.824: E/dalvikvm(12105): Could not find class 'com.squareup.okhttp.HttpResponseCache', referenced from method com.squareup.picasso.OkHttpDownloader.<init>
J'ai ajouté okhttp juste pour utiliser la méthode suivante:
public static String executeHttpGet(String urlStr) {
Response response = null;
String result = "";
OkHttpClient client = new OkHttpClient();
try {
Request request = new Request.Builder().url(urlStr).build();
response = client.newCall(request).execute();
result = response.body().string();
} catch (Exception ex) {
}
return result;
}
Le code ci-dessus fonctionne sans aucun problème. Cependant, les codes qui utilisent la bibliothèque Picasso et fonctionnaient parfaitement, commencent à lancer l'exception suivante:
06-12 11:19:49.307: E/AndroidRuntime(13036): FATAL EXCEPTION: main
06-12 11:19:49.307: E/AndroidRuntime(13036): Java.lang.NoClassDefFoundError: com.squareup.okhttp.HttpResponseCache
06-12 11:19:49.307: E/AndroidRuntime(13036): at com.squareup.picasso.OkHttpDownloader.<init>(OkHttpDownloader.Java:74)
06-12 11:19:49.307: E/AndroidRuntime(13036): at com.squareup.picasso.OkHttpDownloader.<init>(OkHttpDownloader.Java:51)
06-12 11:19:49.307: E/AndroidRuntime(13036): at com.squareup.picasso.OkHttpDownloader.<init>(OkHttpDownloader.Java:41)
06-12 11:19:49.307: E/AndroidRuntime(13036): at com.squareup.picasso.Utils$OkHttpLoaderCreator.create(Utils.Java:319)
06-12 11:19:49.307: E/AndroidRuntime(13036): at com.squareup.picasso.Utils.createDefaultDownloader(Utils.Java:171)
06-12 11:19:49.307: E/AndroidRuntime(13036): at com.squareup.picasso.Picasso$Builder.build(Picasso.Java:490)
06-12 11:19:49.307: E/AndroidRuntime(13036): at com.squareup.picasso.Picasso.with(Picasso.Java:390)
Mon chemin de classe:
Si je supprime okhttp-2.0.0-RC2, okio-1.0.0, les lignes Picasso fonctionnent.
Pourquoi cela se produit-il? Comment puis-je utiliser deux bibliothèques ensemble?
Cette combinaison fonctionne pour moi:
compile 'com.squareup.okhttp:okhttp:2.2.0'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.2.0'
compile 'com.squareup.picasso:picasso:2.4.0'
Passez à Picasso 2.3.2. Vous aurez également besoin de okhttp-urlconnection-2.0.0-RC2.
//Below code for Picasso initializing once for the app
private Picasso picasso;
private OkHttpClient okHttpClient;
okHttpClient = new OkHttpClient();
picasso = new Picasso.Builder(this)
.downloader(new OkHttpDownloader(okHttpClient))
.build();
//Below code to retrieve the images whereever required on the app
picasso.with(context).load(imageUrl).placeholder(R.drawable.ic_launcher)
Le code ci-dessus fonctionne bien pour moi.
Picasso utilise 3 packages.
Vous souhaitez ajouter 2 fois le package OkHttp et OkIO en raison de l'utilisation de la bibliothèque OkHttp et de la bibliothèque Picasso.
Les 2 packages sont inclus dans Picasso, vous n'avez pas besoin d'inclure la bibliothèque OkHttp dans votre projet.
Essayez-les:
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.squareup.okhttp3:okhttp:3.0.1'