我正在构建一个应用程序并使用Joda Time代替java内置的Date / Time类。但我面临一个问题,当我使用编译应用程序时 Android API 22 它运行正常,但是当我用 android API 23 编译它时会抛出 NoClassDefFoundError 异常。 我的 build.gradle 正在关注
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion '23.0.2'
defaultConfig {
multiDexEnabled true
applicationId 'com.my.app'
minSdkVersion 11
targetSdkVersion 23
versionCode 6
versionName '5.0.1'
}
buildTypes {
release {
//runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
}
sourceSets {
main {
assets.srcDirs = ['src/main/assets', 'src/main/assets/downloadMusicMishari', 'src/main/assets/downloadmusicSaad']
}
}
dexOptions {
incremental true
javaMaxHeapSize "4g"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
//compile 'com.android.support:support-v4:20.0.0'
compile project(':facebook')
compile project(':library')
compile files('libs/PayPalAndroidSDK-2.9.10.jar')
compile files('libs/picasso-2.5.2.jar')
compile project(':justifiedTextViewmaster')
compile 'joda-time:joda-time:2.3'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.google.android.gms:play-services:8.3.0'
compile 'com.android.support:multidex:1.0.0'
}
repositories {
mavenCentral()
}
答案 0 :(得分:3)
<强> NoClassDefFoundError的强>
如果Java虚拟机或ClassLoader实例尝试,则抛出该异常 加载类的定义(作为普通方法调用的一部分或 作为使用新表达式创建新实例的一部分)和否 可以找到班级的定义。
请检查 Joda-Time library with Android specialization
尝试:
dependencies {
compile 'net.danlew:android.joda:2.9.2' // For API Level 23 or Above
}
然后 清理重建 您的IDE
修改强>
确保初始化JodaTimeAndroid.init(this);
完成后,您必须在使用之前初始化库 调用JodaTimeAndroid.init()。我建议把这段代码放进去 Application.onCreate():
public class YourApplicationClass extends Application {
@Override
public void onCreate() {
super.onCreate();
JodaTimeAndroid.init(this);
}
}
最终修改
Removed Joda plugin
答案 1 :(得分:2)
<强> NoClassDefFoundError的强>
如果Java虚拟机或ClassLoader实例尝试,则抛出加载类的定义(作为普通方法调用的一部分) 或者作为使用新表达式创建新实例的一部分)和否 可以找到班级的定义。
当前正在执行的搜索类定义存在 编译了类,但无法再找到定义。
因此,请考虑使用专为Android设计的JODA库。您可能会问为什么使用此库而不是其他库。另一个存在一个特殊问题。即由于使用ClassLoader.getResourceAsStream()
,它大大增加了应用程序的内存占用。 (有关详细信息,请参阅this blog post。)此库可以避免Android的问题。
此库还具有专为Android设计的额外实用程序。例如,请参阅DateUtils,即Android DateUtils.
的端口尝试更改compile 'joda-time:joda-time:2.3'
至:compile 'net.danlew:android.joda:2.9.1'
这很有效。我在SDK 23的应用程序中使用它!
编辑1
如果是ISO8601格式,那么即使不使用Joda也可以解析它。这样:
try {
DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
Date result = format.parse("2015-05-19T04:00:00.000Z");
Calendar cal = Calendar.getInstance();
cal.setTime(result);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
output = day+" "+month+" "+year;
Log.w("THE DATE IS:",""+output);
}
catch (Exception e){e.printStackTrace();}