java.lang.NoClassDefFoundError在onStart中注册eventbus方法4.4 os版本

时间:2016-04-28 07:20:11

标签: java android android-studio android-activity broadcastreceiver

集成事件总线库后,它适用于OS 5.0及更高版本,但导致4.4等较低版本的异常,并收到此错误,

  

java.lang.ExceptionInInitializerError at   com.tbox.doormanapp.GuestListActivity.onCreate(GuestListActivity.java:53)   在android.app.Activity.performCreate(Activity.java:5008)处   android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)   在   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)   在   android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)   在android.app.ActivityThread.access $ 600(ActivityThread.java:130)at   android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1195)   在android.os.Handler.dispatchMessage(Handler.java:99)at   android.os.Looper.loop(Looper.java:137)at   android.app.ActivityThread.main(ActivityThread.java:4745)at   java.lang.reflect.Method.invokeNative(Native Method)at   java.lang.reflect.Method.invoke(Method.java:511)at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)   在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)at   dalvik.system.NativeStart.main(Native方法)引起:   java.lang.NoClassDefFoundError:   org.greenrobot.eventbus.EventBusBuilder at   org.greenrobot.eventbus.EventBus。(EventBus.java:48)at   com.tbox.doormanapp.GuestListActivity.onCreate(GuestListActivity.java:53)   在android.app.Activity.performCreate(Activity.java:5008)处   android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)   在   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)   在   android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)   在android.app.ActivityThread.access $ 600(ActivityThread.java:130)at   android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1195)   在android.os.Handler.dispatchMessage(Handler.java:99)at   android.os.Looper.loop(Looper.java:137)at   android.app.ActivityThread.main(ActivityThread.java:4745)at   java.lang.reflect.Method.invokeNative(Native Method)at   java.lang.reflect.Method.invoke(Method.java:511)

他们已在此官方网站上发布了有关此问题的解决方案 http://greenrobot.org/eventbus/documentation/faq/ 但这对我来说真的很难得到他们想说的解决方案。

以下是他们所描述的内容,

注册订阅者类时抛出java.lang.NoClassDefFoundError。我能做什么? 首先是一些背景知识,以帮助您了解这里发生了什么:一些Android版本在调用getDeclaredMethods或getMethods时似乎有反射错误。如果类具有带有设备API级别不可用的参数的方法,则抛出异常。例如,在API级别21中添加了PersistableBundle类。除了新类之外,还在具有PersistableBundle作为参数的Activity类中引入了一些新的生命周期方法,例如onCreate(Bundle savedInstanceState,PersistableBundle persistentState)。现在,如果您重写此方法并尝试在旧设备上将此活动注册到EventBus,那么我们确实描述了导致错误的方案。了解发生这种情况的原因将有助于轻松解决问题。

以下是一些如何修复方案的建议(检查订单):

也许你偶然用PersistableBundle覆盖了一个生命周期方法。在这种情况下,只需更改为不带PersistableBundle的方法,例如onCreate(Bundle savedInstanceState)。

将EventBus 3与订阅者索引一起使用。这样可以避免反射,从而避免问题。作为一个积极的副作用,注册订阅者和应用程序启动时间会快得多。

从您的订阅者类中删除有问题的方法。将事件处理程序方法拉出到新的订阅者类中,或将违规方法拉出到非订阅者类中。

如果违规方法是公开的,请将其设为非公开。这是因为一些“计划b”逻辑EventBus适用:EventBus首先调用getDeclaredMethods,这将失败。接下来,EventBus将使用getMethods(“plan b”)再次尝试。后者将成功,因为getMethods只返回公共方法。但是,请记住,这是性能方面效率最低的方法(考虑到整个类层次结构,2个反射调用而不是1个getMethods)。

根据我的理解,非上述工作,他们也是一些开放的问题,如, https://github.com/greenrobot/EventBus/issues/287 https://github.com/greenrobot/EventBus/issues/302 没有人提出任何真实的解决方案任何帮助将受到高度赞赏。

1 个答案:

答案 0 :(得分:10)

从评论我认为问题是multidex。这是因为可以启用Android 5.0以及MultiDex。对于运行5.0之前版本的设备和模拟器。必须以不同的方式启用Multidex。

首先使您的应用程序类扩展MultiDexApplication而不是Application:

public class MyApplicationClass extends MultiDexApplication....
// use import android.support.multidex.MultiDexApplication;

在这个类中重写了attachBaseContext()方法,并输入以下代码:

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(AppController.this);
}

放置multidex依赖项并在app的build.grdle中启用它:

compile 'com.android.support:multidex:1.0.1' //dependencies section
multiDexEnabled true //in default config

此解决方案适用于棒棒糖前后设备。