首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NoClassDefFoundError for OkHttpClient

NoClassDefFoundError for OkHttpClient
EN

Stack Overflow用户
提问于 2016-02-23 12:53:03
回答 4查看 21.2K关注 0票数 14

在gradle中添加facebook依赖项之后,我将得到以下运行时错误:

代码语言:javascript
复制
     compile 'com.facebook.android:facebook-android-sdk:4.6.0'

请注意,我也在使用okhttp:

代码语言:javascript
复制
    compile 'com.squareup.okhttp:okhttp:2.5.0'

错误日志是:

代码语言:javascript
复制
 E/AndroidRuntime: FATAL EXCEPTION: Thread-109754
     Process: com.venkat.project, PID: 4453
            java.lang.NoClassDefFoundError: com.squareup.okhttp.internal.Util
            at com.squareup.okhttp.OkHttpClient.<clinit>(OkHttpClient.java:57)
            at com.venkat.project.http.MyHTTPThread.run(MyHTTPThread.java:127)
            at com.venkat.project.http.MyHTTPThread.run(MyHTTPThread.java:61)
            at java.lang.Thread.run(Thread.java:841)
02-23 18:11:02.729 4453-4573/com.venkat.project I/dalvikvm: Rejecting re-init on previously-failed class Lcom/squareup/okhttp/OkHttpClient; v=0x0

注意:我在三星手机4.4上得到了这个错误,但是在模拟器和moto g 5.0上,它是可以工作的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-02-29 06:05:24

你得到了

代码语言:javascript
复制
       java.lang.NoClassDefFoundError: com.squareup.okhttp.internal.Util
        at com.squareup.okhttp.OkHttpClient.<clinit>(OkHttpClient.java:57)
        at com.venkat.project.http.MyHTTPThread.run(MyHTTPThread.java:127)
        at com.venkat.project.http.MyHTTPThread.run(MyHTTPThread.java:61)

NoClassDefFoundError for OkHttpClient

代码语言:javascript
复制
public class NoClassDefFoundError extends LinkageError

如果或ClassLoader实例试图加载类的定义(作为普通方法调用的一部分或作为使用新表达式创建新实例的一部分),则抛出,则无法找到该类的定义。

来自NoClassDefFoundError的报价

你应该用

代码语言:javascript
复制
compile 'com.facebook.android:facebook-android-sdk:4.10.0'

在此之后,您可以使用非零退出值2完成此错误

然后

代码语言:javascript
复制
defaultConfig {
    ...
    minSdkVersion 14 //lower than 14 doesn't support multidex
    targetSdkVersion //Yours

    // Enabling multidex support.
    multiDexEnabled true
}

dependencies {
 implementation 'com.android.support:multidex:1.0.0'
}
  1. 添加multiDexEnabled真
  2. 调用implementation'com.android.support:multidex:1.0.2'

当网络遇到麻烦时,OkHttp会坚持下去:它会从常见的连接问题中默默地恢复过来。如果您的服务有多个IP地址,如果第一个连接失败,OkHttp将尝试备用地址。这对于IPv4+IPv6和驻留在冗余数据中心中的服务来说是必要的。

您可以调用最新版本。

代码语言:javascript
复制
implementation'com.squareup.okhttp3:okhttp:3.2.0'

然后

Clean and Re-Build & Sync你的项目。希望这能有所帮助。

票数 5
EN

Stack Overflow用户

发布于 2016-08-02 08:11:04

最新版本的Piccasso使用一个旧版本的Okhttp,您需要使用一个新的依赖项

代码语言:javascript
复制
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.picasso:picasso:2.5.2'    
compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.0.2'

示例:

代码语言:javascript
复制
File httpCacheDirectory = new File(getCacheDir(), "picasso-cache");
Cache cache = new Cache(httpCacheDirectory, 10 * 1024 * 1024);

OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder().cache(cache);
Picasso.Builder picassoBuilder = new Picasso.Builder(getApplicationContext());
picassoBuilder.downloader(new OkHttp3Downloader(clientBuilder.build()));
Picasso picasso = picassoBuilder.build();
try {
   Picasso.setSingletonInstance(picasso);
} catch (IllegalStateException ignored) {
  Log.e(LOG_TAG, "Picasso instance already used");
}
票数 15
EN

Stack Overflow用户

发布于 2016-02-29 05:20:04

https://developer.android.com/tools/building/multidex.html

Android5.0及更高版本的Multidex支持

Android5.0及更高版本使用称为ART的运行时,它本机支持从应用程序APK文件加载多个dex文件。ART在应用程序安装时执行预编译,扫描类(..N).dex文件,并将它们编译成单个.oat文件,由安卓设备执行。有关Android5.0运行时的更多信息,请参见介绍ART。这意味着您的应用程序在API 21级或更高级别上可以正常工作。

Android5.0之前的Multidex支持

Android5.0之前的平台版本使用Dalvik运行时来执行应用程序代码。默认情况下,Dalvik将每个APK的应用程序限制为一个classes.dex字节码文件。为了克服这个限制,您可以使用multidex支持库,它成为应用程序的主DEX文件的一部分,然后管理对其他DEX文件及其包含的代码的访问。

尝试添加以下内容

代码语言:javascript
复制
dependencies {
  compile 'com.android.support:multidex:1.0.0'
}

在清单中,将MultiDexApplication类从multidex支持库添加到应用程序元素。

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
    <application
        ...
        android:name="android.support.multidex.MultiDexApplication">
        ...
    </application>
</manifest>

除此之外,如果应用程序扩展了应用程序类,则可以重写attachBaseContext()方法并调用MultiDex.install(this)来启用multidex。

代码语言:javascript
复制
public void onCreate(Bundle arguments) {
    MultiDex.install(getTargetContext());
    super.onCreate(arguments);
    ...
}

最后,您需要按下面的方式更新build.gradle文件,方法是添加multiDexEnabled true:

代码语言:javascript
复制
defaultConfig {  
        applicationId '{Project Name}'  
        minSdkVersion 15  
        targetSdkVersion 23  
        versionCode 1  
        versionName "1.0"  
        multiDexEnabled true  
    }  

我希望它能帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35578135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档