android - Retrofit + SimpleXMLConverter 适用于 Lollipop,不适用于 Kitkat

标签 android android-5.0-lollipop retrofit android-4.4-kitkat

我有一个运行良好的应用程序。然而,当我开始使用 CompileSDKVersion 23 时(我从 22 升级,因为工具栏未在 Lollipop 中显示)。现在它可以在 Lollipop 设备上运行,但当我在 Kitkat 上运行时会崩溃。

错误:

java.lang.NoClassDefFoundError: retrofit.converter.SimpleXMLConverter
        at com.app.appname.api.AppAPI.<init>(AppAPI.java:80)
        at com.app.appname.api.AppAPI.getInstance(AppAPI.java:95)
        at com.app.appname.broker.DataBroker.<init>(DataBroker.java:31)
        at com.app.appname.broker.DataBroker.init(DataBroker.java:35)
        at com.app.appname.AppApplication.onCreate(AppApplication.java:18)
        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4417)
        at android.app.ActivityThread.access$1500(ActivityThread.java:139)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1260)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5105)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
        at dalvik.system.NativeStart.main(Native Method)

我正在尝试初始化 Retrofit API:

mAdapter = new RestAdapter.Builder()
            .setEndpoint(...)
            .setConverter(new SimpleXMLConverter())
            .setLogLevel(RestAdapter.LogLevel.FULL)
            .build();

我的 Gradle 看起来像这样:

apply plugin: 'com.android.application'

repositories {
    mavenCentral()

    maven {
        url "https://raw.github.com/embarkmobile/zxing-android-minimal/mvn-repo/maven-repository/"
    }
}

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "com.app.appname"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "0.0.0.1"
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    lintOptions {
        checkReleaseBuilds false
        // Or, if you prefer, you can continue to check for errors in release builds,
        // but continue the build even when errors are found:
        abortOnError false
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:support-v4:23.0.1'
    compile 'com.android.support:support-annotations:23.0.1'
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:design:23.0.1'

    compile 'com.squareup.okhttp:okhttp-urlconnection:2.5.0'
    compile 'com.squareup.retrofit:retrofit:1.9.0'
    compile('com.squareup.retrofit:converter-simplexml:1.9.0'){
        exclude module: 'stax'
        exclude module: 'stax-api'
        exclude module: 'xpp3'
    }

    compile 'com.google.android.gms:play-services:8.1.0'

    compile 'com.google.code.gson:gson:2.3.1'

    compile 'com.squareup.picasso:picasso:2.5.2'

    compile 'com.facebook.android:facebook-android-sdk:4.1.0'

    compile 'com.google.zxing:core:2.2'
    compile 'com.embarkmobile:zxing-android-minimal:1.2.1@aar'
}

我已经尝试过:

  1. 将 JCenter() 添加到存储库
  2. 包括 GSon 库
  3. 将所有 Activity 移至单个包并在 list 中设置包名称
  4. 查找注释(我在“首选项”->“构建”->“编译器”下找不到它)
  5. 部署到具有相同 API 级别 (4.2.2) 的不同设备

最佳答案

我使用的设置与您的设置几乎相同,包括:

改造1.9.0
SimpleXMLConverter 1.9.0
编译SdkVersion 23
targetSdkVersion 23
buildTools版本 23.0.1

我的应用程序运行良好,一直低至 API 级别 16(我的最低级别)。

我发现可能导致问题的主要差异是:

1) 从 SimpleXMLConverter 中排除 stax、stax-api 和 xpp3。我记得当我开始使用它时也排除了这些,因为我遇到了一些问题,但我不再需要排除它们,也许尝试删除排除并看看?

2) 包括 Okhttp-urlconnection。我知道 Retrofit 会自动使用它,如果包含它,可能会导致问题(只是猜测)。

3) 启用 Multidex。我自己没有搞过这个,但我在 StackOverflow 上读过它的问题,如果可能的话,尝试禁用它看看?可能最好启用 minify 而不是运行 multidex,以删除一些不需要的功能。

关于android - Retrofit + SimpleXMLConverter 适用于 Lollipop,不适用于 Kitkat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33048039/

相关文章:

java - 使用 Retrofit with Field 传递参数

android - 如何在另一个记录器类中使用另一个类的变量

android - 闹钟管理器取消不工作 Android

android - appWidget 仅在 Lollipop 设备的启动器小部件列表中不显示

android - HTML 下拉菜单在 Android Lollipop 中显示为空

java - Cordova 上的 Android Lollipop 通知图标 setColor

android - Retrofit2.1 附带的默认 OkHttp 版本?

android - 默认不打开抽屉导航

android - Android ExceptionInInitializerError Stripe

java - 如何在 Android 中的用户输入表单上获取选中的单选按钮并将选择存储为字符串