ars*_*tic 2 java android broadcastreceiver android-activity android-studio
集成事件总线库后,它适用于操作系统版本5.0及更高版本,但导致4.4等较低版本的异常,并收到此错误,
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java)的android.app.Activity.performCreate(Activity.java:5008)的com.tbox.doormanapp.GuestListActivity.onCreate(GuestListActivity.java:53)中的java.lang.ExceptionInInitializerError: 1079)在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)的android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)在android.app.ActivityThread.access $ 600(ActivityThread.java:130)在android .app.ActivityThread $ H.handleMessage(ActivityThread.java:1195)位于android.app的android.os.Handler.dispatchMessage(Handler.java:99)android.os.Looper.loop(Looper.java:137). ActivityThread.main(ActivityThread.java:4745)位于java.lang.reflect.Method.invokeNative(Native Method),位于com.android.internal.os的java.lang.reflect.Method.invoke(Method.java:511). ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)at dalvik.system.NativeStart.main(Native 方法)引起:java.lang.NoClassDefFoundError:org.greenrobot.eventbus.EventBusBuilder atg.greenrobot.eventbus.EventBus.(EventBus.java:48)at com.tbox.doormanapp.GuestListActivity.onCreate(GuestListActivity.java:53 )android.app.A活动中的android.app.Anstrumentation.callActivityOnCreate(Instrumentation.java:1079)android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)的android.app.Activity.performCreate(Activity.java:5008) .ActivityThread.handleLaunchActivity(ActivityThread.java:2084)在Android.app.Handler的android.app.ActivityThread.access $ 600(ActivityThread.java:130)android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1195) android.app.Looper.loop(Looper.java:137)中的.dispatchMessage(Handler.java:99)位于android.app.ActivityThread.main(ActivityThread.java:4745)的java.lang.reflect.Method.invokeNative( java.lang.reflect.Method.invoke上的Native Method)(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 没有人是提出任何真实的解决方案任何帮助将受到高度赞赏.
dru*_*abs 10
从评论我认为问题是multidex.这是因为可以启用Android 5.0以及MultiDex.对于运行5.0之前版本的设备和模拟器.必须以不同的方式启用Multidex.
首先使您的应用程序类扩展MultiDexApplication而不是Application:
public class MyApplicationClass extends MultiDexApplication....
// use import android.support.multidex.MultiDexApplication;
Run Code Online (Sandbox Code Playgroud)
在这个类中重载了attachBaseContext()方法并放入此代码:
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(AppController.this);
}
Run Code Online (Sandbox Code Playgroud)
放置multidex依赖项并在app的build.grdle中启用它:
compile 'com.android.support:multidex:1.0.1' //dependencies section
multiDexEnabled true //in default config
Run Code Online (Sandbox Code Playgroud)
这种解决方案在Lollipop前后设备上运行得非常好.