OkHTTP和Picasso不能一起运行

21
我在项目中使用Picasso库来加载并缓存图片,一直运行良好没有出现问题。但是,当我尝试使用OkHttp库与服务器进行数据通信(JSON通信)时,Picasso就会抛出异常。
我使用以下的jar包:okhttp-2.0.0-RC2、okio-1.0.0、picasso-2.2.0。当我添加了这些jar包后运行项目,它就崩溃并显示如下错误信息:
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>

我添加了OkHttp只是为了使用以下方法:

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

上述代码没有任何问题。但是使用Picasso库并且之前完美运行的代码,开始抛出以下异常:

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)

我的类路径:

enter image description here

如果我移除okhttp-2.0.0-RC2和okio-1.0.0的行,Picasso就可以正常工作。

这是为什么?我该如何同时使用这两个库?


你是如何构建的?你使用集成开发环境吗?是用的工作室还是ADT? - Boris Strandjev
我使用Eclipse Android开发工具。我添加了一个构建路径的屏幕截图。 - anL
我认为问题可能出在构建路径上。显然,picasso中捆绑了okhttp的一个版本。这个版本可能包含需要使用的类,但是你在picasso之前将单独的okhttp jar加载到类路径中,它会覆盖捆绑的库。尝试更改类路径中库文件的顺序(手动编辑.classpath文件)。 - Boris Strandjev
6个回答

22

这个组合对我来说很有效:

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'

19

切换到Picasso 2.3.2版本。您还需要okhttp-urlconnection-2.0.0-RC2。


1
我移除了“compile 'com.squareup.okhttp:okhttp:2.0.0-RC2'”并包含了“compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0-RC2'”,然后它开始工作了。 - David Dehghan
谢谢您的回复。但是我找不到okhttp-urlconnection-2.0.0-RC2.jar。您能分享一下链接吗? - anL
2
这个组合似乎可行:Picasso 2.3.3,okhttp 2.0.0,okio 1.0.0和okhttp-urlconnection 2.0.0来自http://search.maven.org/#browse%7C372052866。 - sgibly
没有任何一种组合对我有效,大家还有其他想法吗? - bogdan
要在此版本的Picasso中使用OkHttp,您需要: [1] com.squareup.okhttp:okhttp:1.6.0或更新版本 和 [2] com.squareup.okhttp:okhttp-urlconnection:1.6.0或更新版本 - AlexKorovyansky

6
//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)

上述代码对我来说很好用。

我使用静态方法。 Picasso.with(activity).load(AppData.samplepath+"/"+ folder+"/"+photo.getPhotoId()+AppData.extension).fit().centerCrop().placeholder(R.drawable.photoload).into(view, new Callback() { ... - anL
1
请问您能分享一下您的类路径(classpath)JAR包顺序吗? - anL
我正在使用Android Studio Gradle。不确定ADT类路径的顺序。 - Yogesh Narayanan
2
在2.5.2版本中,Picasso默认使用OkHttp。 - Nicholas Ng

1

Picasso使用了3个包。

  1. Square.OkHttp
  2. Square.OkIO
  3. Square.Picasso

由于使用OkHttp库和Picasso库,您需要添加2次OkHttp和OkIO包。

这2个包已经包含在Picasso中,您不需要在项目中包含OkHttp库。


0

尝试这些:

compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.squareup.okhttp3:okhttp:3.0.1'

你能提供更多的信息说明为什么这两个版本的组合可以解决问题吗? - Danielson

0
如果你正在使用Eclipse IDE,在项目属性->Java Build Path->Order and Export(最后一个选项卡)中勾选Picasso库。
我曾经遇到过相同的错误。对我有用,希望也能帮到你。 enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接