xiaofei-it / hermeseventbus Goto Github PK
View Code? Open in Web Editor NEWA library for using EventBus between processes, useful in the IPC or plugin development.
License: Other
A library for using EventBus between processes, useful in the IPC or plugin development.
License: Other
这两个问题都一直频繁出现(尤其在sony的一台机器上,其他的还好)
版本:compile 'xiaofei.library:hermes-eventbus:0.2.0'
一个process进程,连接主程序,主要post消息 thread ==>(in main thread)
是我的配置问题,还是设备问题?
这两个问题,出现的频率基本上一小时~两小时出现一次
UPDATE:
通常在使用,高德地图或其他软件时发生
另外程序内部,经常报DeadObjectException,所以主程序内部通信采用EventBus发送消息,但是在Activity-create时仍用HermesEventBus-register(这个问题,基本所有的机器都提示,改了之后没有)
问题1:
`
FINGERPRINT=google/razor/flo:4.3/JWR66N/711294:user/dev-keys
HARDWARE=vbox86
UNKNOWN=unknown
RADIO=unknown
BOARD=flo
versionCode=3
PRODUCT=razor
versionName=1.0.0
DISPLAY=JWR66N
USER=Tracker
HOST=vpbs6.mtv.corp.google.com
DEVICE=Tracker
TAGS=test-keys
MODEL=Nexus 11
BOOTLOADER=unknown
CPU_ABI=armeabi-v7a
CPU_ABI2=armeabi
IS_DEBUGGABLE=true
CPU_ABI3=unknown
ID=JWR66N
SERIAL=unknown
MANUFACTURER=asus
BRAND=Google
java.lang.IllegalStateException: An error occurred in the GC.
at android.os.Parcel.readException(Parcel.java:1473)
at android.os.Parcel.readException(Parcel.java:1419)
at xiaofei.library.hermes.internal.IHermesService$Stub$Proxy.gc(IHermesService.java:168)
at xiaofei.library.hermes.internal.Channel.gc(Channel.java:240)
at xiaofei.library.hermes.util.HermesGc.gc(HermesGc.java:92)
at xiaofei.library.hermes.util.HermesGc.register(HermesGc.java:99)
at xiaofei.library.hermes.Hermes.getProxy(Hermes.java:97)
at xiaofei.library.hermes.Hermes.getInstanceWithMethodNameInService(Hermes.java:163)
at xiaofei.library.hermes.Hermes.getInstanceInService(Hermes.java:126)
at xiaofei.library.hermeseventbus.HermesEventBus$HermesListener.onHermesConnected(HermesEventBus.java:287)
at xiaofei.library.hermes.internal.Channel$HermesServiceConnection.onServiceConnected(Channel.java:284)
at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1110)
at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1127)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5055)
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:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)`
问题2:
`SUPPORTED_64_BIT_ABIS=[Ljava.lang.String;@f3b577b
versionCode=2
BOARD=msm8994
BOOTLOADER=s1
TYPE=user
ID=32.2.A.0.305
BRAND=Sony
TAG=Build
SERIAL=BH9004RC4C
HARDWARE=qcom
SUPPORTED_ABIS=[Ljava.lang.String;@50de998
CPU_ABI=arm64-v8a
RADIO=unknown
IS_DEBUGGABLE=false
MANUFACTURER=Sony
SUPPORTED_32_BIT_ABIS=[Ljava.lang.String;@a12130a
TAGS=release-keys
CPU_ABI2=
UNKNOWN=unknown
USER=BuildUser
FINGERPRINT=Sony/E6683/E6683:6.0.1/32.2.A.0.305/724807262:user/release-keys
HOST=BuildHost
PRODUCT=E6683
DEVICE=E6683
java.lang.NullPointerException: Attempt to invoke interface method 'void xiaofei.library.hermes.internal.IHermesService.gc(java.util.List)' on a null object reference
at xiaofei.library.hermes.internal.Channel.gc(Channel.java:240)
at xiaofei.library.hermes.util.HermesGc.gc(HermesGc.java:92)
at xiaofei.library.hermes.util.HermesGc.register(HermesGc.java:99)
at xiaofei.library.hermes.Hermes.getProxy(Hermes.java:97)
at xiaofei.library.hermes.Hermes.getInstanceWithMethodNameInService(Hermes.java:163)
at xiaofei.library.hermes.Hermes.getInstanceInService(Hermes.java:126)
at xiaofei.library.hermeseventbus.HermesEventBus$HermesListener.onHermesConnected(HermesEventBus.java:287)
at xiaofei.library.hermes.internal.Channel$HermesServiceConnection.onServiceConnected(Channel.java:284)
at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1227)
at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1244)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:234)
at android.app.ActivityThread.main(ActivityThread.java:5526)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)`
最新版本中在主进程启动service,子进程即使在退出前调用HermesEventBus.getDefault().destroy();然后杀死子进程(Process.killProcess(Process.myPid());)后,再启动子进程,主进程使用HermesEventBus post事件后仍然产生异常:android.os.DeadObjectException,调试发现是主进程持有已经dead的子进程service造成的,可在子进程退出前该怎么处理呢?
Fatal Exception: java.lang.NullPointerException: Attempt to invoke interface method 'void xiaofei.library.hermeseventbus.IMainService.register(int, xiaofei.library.hermeseventbus.ISubService)' on a null object reference
at xiaofei.library.hermeseventbus.HermesEventBus$HermesListener.onHermesConnected(HermesEventBus.java:288)
at xiaofei.library.hermes.internal.Channel$HermesServiceConnection.onServiceConnected(Channel.java:284)
at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1305)
at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1322)
at android.os.Handler.handleCallback(Handler.java:743)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:150)
at android.app.ActivityThread.main(ActivityThread.java:5546)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)
step 3: (不同app之间通信)
在app间收发的事件类必须有相同的包名、相同的类名和相同的方法? 这样似乎限制太多啦,而且这样还能在同一个手机上装这样两个应用吗?
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v7/app/ActionBarActivity;
AndroidRuntime: FATAL EXCEPTION: main
Process: com.yishun, PID: 6752
java.lang.NoClassDefFoundError: xiaofei.library.concurrentutils.util.NonNullCondition
at xiaofei.library.concurrentutils.ObjectCanary.(ObjectCanary.java:39)
at xiaofei.library.concurrentutils.ObjectCanary.(ObjectCanary.java:61)
at xiaofei.library.hermeseventbus.HermesEventBus.(HermesEventBus.java:56)
at xiaofei.library.hermeseventbus.HermesEventBus.getDefault(HermesEventBus.java:63)
at com.yishun.manager.CMCCApplication.onCreate(CMCCApplication.java:421)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4438)
at android.app.ActivityThread.access$1500(ActivityThread.java:141)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1270)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5111)
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:806)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
at dalvik.system.NativeStart.main(Native Method)
楼主,报这个错误,怎么搞???
以下是我的测试数据,每次事件中带有1K bytes的数据,耗时取的是1000次事件的平均值:
机型 broadcast耗时 Hermes耗时
Nexus6 11.83ms 7.79ms
LG D858 9.21ms 11.6ms
小米note 5.08ms 10.77ms
oppo A31 28.66ms 13.4ms
我看你是在发送事件事件时每次都做了锁和解锁,感觉可能是这里产生了耗时。但service bind成功之后已经是同步接口了,感觉多线程的情况才需要做锁或者synchronized。
请问基于什么考虑做锁呢?
java.lang.IllegalStateException: Service Unavailable: You have not connected the service or the connection is not completed. You can set HermesListener to receive a callback when the connection is completed.
at xiaofei.library.hermes.Hermes.checkBound(Hermes.java:87)
at xiaofei.library.hermes.Hermes.getInstanceWithMethodNameInService(Hermes.java:139)
at xiaofei.library.hermes.Hermes.getInstanceInService(Hermes.java:126)
at xiaofei.library.hermes.Hermes.getInstance(Hermes.java:130)
at com.yztc.itemcollect2.module.hermes.HermesActivity.onViewClicked(HermesActivity.java:50)
at com.yztc.itemcollect2.module.hermes.HermesActivity_ViewBinding$3.doClick(HermesActivity_ViewBinding.java:59)
at butterknife.internal.DebouncingOnClickListener.onClick(DebouncingOnClickListener.java:22)
at android.view.View.performClick(View.java:5207)
at android.view.View$PerformClick.run(View.java:21177)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5441)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:163)
FATAL EXCEPTION: main
Process: com.lewis.sample:DB, PID: 22211
java.lang.NullPointerException: Attempt to invoke interface method 'void xiaofei.library.hermeseventbus.IMainService.register(int, xiaofei.library.hermeseventbus.ISubService)' on a null object reference
at xiaofei.library.hermeseventbus.HermesEventBus$HermesListener.onHermesConnected(HermesEventBus.java:291)
at xiaofei.library.hermes.internal.Channel$HermesServiceConnection.onServiceConnected(Channel.java:288)
at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1329)
at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1346)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:179)
at android.app.ActivityThread.main(ActivityThread.java:5739)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674)
android.support.v7.app.ActionBarActivity
类从support库v26.0.2中删除了
导致错误:
java.lang.NoClassDefFoundError: android.support.v7.app.ActionBarActivity
at xiaofei.library.hermes.util.TypeUtils$1.<init>(TypeUtils.java:51)
at xiaofei.library.hermes.util.TypeUtils.<clinit>(TypeUtils.java:48)
at xiaofei.library.hermes.util.TypeCenter.register(TypeCenter.java:94)
at xiaofei.library.hermes.Hermes.register(Hermes.java:71)
at xiaofei.library.hermeseventbus.HermesEventBus.init(HermesEventBus.java:122)
java.lang.NullPointerException
at xiaofei.library.hermeseventbus.HermesEventBus$HermesListener.onHermesConnected(HermesEventBus.java)
at xiaofei.library.hermes.internal.Channel$HermesServiceConnection.onServiceConnected(Channel.java)
at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1106)
at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1123)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(NativeStart.java)
个人感觉HermesEventBus没有完全实现粘性特征,HermesEventBus必须在register之后才能进行事件的收发;而EventBus先发送粘性事件,后进行注册依然能收到。估计这可能是评论区中说收不到事件的主要原因,HermesEventBus和EventBus还是有一些区别的。
在多个APP之间通讯的时候,在子 APP 中Application调用connect主APP,然后调用post,主APP不能收到该Event,还有主APP如何把事件post给子APP因为主APP是调用init方法的默认使用的EventBus的post了,也就是默认当前进程post,而子app是默认给主APP post想给自己post也没提供方法,我是没用起来
请问这个项目还在维护吗?因为一直是0.3.0版本,一直没有再更新了
It happens when main process get closed and other service is running
接入hermes-eventbus:0.2.0,在debug模式下安装运行都没有问题,但是正是发布打包安装就报
MainActivity及其超类没有公共方法@subscribe注释但实际上都按照dome上的使用方式
/***
* 订阅 退出登录
*/
@subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(String type){
switch (type){
case "LOGIN_OUT":
logindb=DBHelper.getInstance(getApplicationContext())
.getLogin();
break;
}
}
错误信息如下:
12-05 14:00:20.296 9135 9135 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.baima/com.example.baima.MainActivity}: org.greenrobot.eventbus.EventBusException: Subscriber class com.example.baima.MainActivity and its super classes have no public methods with the @subscribe annotation
12-05 14:00:20.296 9135 9135 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2479)
12-05 14:00:20.296 9135 9135 E AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2539)
12-05 14:00:20.296 9135 9135 E AndroidRuntime: at android.app.ActivityThread.access$900(ActivityThread.java:168)
12-05 14:00:20.296 9135 9135 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1378)
12-05 14:00:20.296 9135 9135 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
12-05 14:00:20.296 9135 9135 E AndroidRuntime: at android.os.Looper.loop(Looper.java:150)
12-05 14:00:20.296 9135 9135 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5665)
12-05 14:00:20.296 9135 9135 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
12-05 14:00:20.296 9135 9135 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)
12-05 14:00:20.296 9135 9135 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:689)
12-05 14:00:20.296 9135 9135 E AndroidRuntime: Caused by: org.greenrobot.eventbus.EventBusException: Subscriber class com.example.baima.MainActivity and its super classes have no public methods with the @subscribe annotation
12-05 14:00:20.296 9135 9135 E AndroidRuntime: at org.greenrobot.eventbus.o.a(Unknown Source)
12-05 14:00:20.296 9135 9135 E AndroidRuntime: at org.greenrobot.eventbus.c.a(Unknown Source)
12-05 14:00:20.296 9135 9135 E AndroidRuntime: at xiaofei.library.hermeseventbus.HermesEventBus.a(Unknown Source)
12-05 14:00:20.296 9135 9135 E AndroidRuntime: at com.example.baima.MainActivity.onCreate(Unknown Source)
12-05 14:00:20.296 9135 9135 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:6372)
12-05 14:00:20.296 9135 9135 E AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
12-05 14:00:20.296 9135 9135 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2432)
12-05 14:00:20.296 9135 9135 E AndroidRuntime: ... 9 more
12-05 14:00:20.297 1008 1460 W ActivityManager: Force finishing activity com.example.baima/.MainActivity
We are calling this api from application class onCreate() method. But HermesEventBus.getDefault().init(this) : api is failing with below stack trace -
Caused by java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference
xiaofei.library.hermeseventbus.HermesEventBus.getCurrentProcessName (HermesEventBus.java:109)
xiaofei.library.hermeseventbus.HermesEventBus.isMainProcess (HermesEventBus.java:101)
xiaofei.library.hermeseventbus.HermesEventBus.init (HermesEventBus.java:119)
This crash does not happen always, we got to know about this crash through Firebase crash reporting.
只要发送消息就会报错,但是消息都能收到
01-12 16:07:27.123 12739-12761/xiaofei.library.hermeseventbustest E/HERMES_CALLBACK: Error occurs but does not crash the app.
android.os.DeadObjectException
at android.os.BinderProxy.transact(Native Method)
at xiaofei.library.hermes.internal.IHermesServiceCallback$Stub$Proxy.callback(IHermesServiceCallback.java:122)
at xiaofei.library.hermes.internal.HermesCallbackInvocationHandler.invoke(HermesCallbackInvocationHandler.java:57)
at java.lang.reflect.Proxy.invoke(Proxy.java:379)
at xiaofei.library.hermeseventbus.ISubService.post(ISubService.java)
at xiaofei.library.hermeseventbus.MainService.post(MainService.java:81)
at java.lang.reflect.Method.invoke(Native Method)
at xiaofei.library.hermes.receiver.ObjectReceiver.invokeMethod(ObjectReceiver.java:57)
at xiaofei.library.hermes.receiver.Receiver.action(Receiver.java:125)
at xiaofei.library.hermes.HermesService$1.send(HermesService.java:54)
at xiaofei.library.hermes.internal.IHermesService$Stub.onTransact(IHermesService.java:70)
at android.os.Binder.execTransact(Binder.java:404)
HermesEventBus.getDefault().register(this);
org.greenrobot.eventbus.EventBusException: Subscriber class com.jwar.monitor.MainActivity and its super classes have no public methods with the @subscribe annotation
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v7/app/ActionBarActivity;
at xiaofei.library.hermes.util.TypeUtils$1.(TypeUtils.java:51)
at xiaofei.library.hermes.util.TypeUtils.(TypeUtils.java:48)
at xiaofei.library.hermes.util.TypeCenter.register(TypeCenter.java:94)
at xiaofei.library.hermes.Hermes.register(Hermes.java:71)
at xiaofei.library.hermeseventbus.HermesEventBus.init(HermesEventBus.java:122)
2019-05-16 14:19:46.273 13679-13679/com.xxx.xxx E/HERMES_CALLBACK: Error occurs but does not crash the app.
android.os.DeadObjectException
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(Binder.java:1147)
at xiaofei.library.hermes.internal.IHermesServiceCallback$Stub$Proxy.callback(IHermesServiceCallback.java:122)
at xiaofei.library.hermes.internal.HermesCallbackInvocationHandler.invoke(HermesCallbackInvocationHandler.java:57)
at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
at $Proxy6.post(Unknown Source)
at xiaofei.library.hermeseventbus.MainService.post(MainService.java:81)
at xiaofei.library.hermeseventbus.HermesEventBus$3.call(HermesEventBus.java:209)
at xiaofei.library.hermeseventbus.HermesEventBus$3.call(HermesEventBus.java:206)
at xiaofei.library.hermeseventbus.HermesEventBus.actionInternal(HermesEventBus.java:172)
at xiaofei.library.hermeseventbus.HermesEventBus.post(HermesEventBus.java:206)
at xxx.xxxAccountManager$6.onNext(AccountManager.java:584)
at xxx.xxx.AccountManager$6.onNext(AccountManager.java:574)
at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.tryEmit(ObservableFlatMap.java:262)
at io.reactivex.internal.operators.observable.ObservableFlatMap$InnerObserver.onNext(ObservableFlatMap.java:559)
at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.onNext(ObservableCreate.java:67)
at xxx.xxx.network.base.BaseService$4.subscribe(BaseService.java:135)
at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:40)
at io.reactivex.Observable.subscribe(Observable.java:10842)
at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:162)
at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:200)
at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:252)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)
at android.os.Handler.handleCallback(Handler.java:891)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:7470)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958)
java.lang.NullPointerException: Attempt to invoke virtual method 'void xiaofei.library.concurrentutils.ObjectCanary.set(java.lang.Object)' on a null object reference
at xiaofei.library.hermeseventbus.HermesEventBus$1.onHermesConnected(HermesEventBus.java:98)
atxiaofei.library.hermes.internal.Channel$HermesServiceConnection.onServiceConnected(Channel.java:283)
at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1305)
at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1322)
at android.os.Handler.handleCallback(Handler.java:743)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:150)
at android.app.ActivityThread.main(ActivityThread.java:5546)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)
我在主app里面写的eventbus接收事件,但是子app发过来主app收不到,或者子app就没有发送成功。
主app的接收事件处理
@subscribe(threadMode = ThreadMode.MAIN)
public void helloEventBus(MessageEvent message) {
text_info.setText(message.name);
System.out.println("传递过来的数据:--->>>"+message.name);
}
子app的发送事件
HermesEventBus.getDefault().post(new MessageEvent("tom","123456"));
事件类都是相同的包名,相同的类名,里面结构体都一样。
package com.cn.wt.eventbus;
/**
Below are logs. I've seen this issue on Android app when performing stress test.
Caused by java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference xiaofei.library.hermeseventbus.HermesEventBus.getCurrentProcessName (HermesEventBus.java:109) xiaofei.library.hermeseventbus.HermesEventBus.isMainProcess (HermesEventBus.java:101) xiaofei.library.hermeseventbus.HermesEventBus.init (HermesEventBus.java:119) com.google.atap.jacquard.application.JacquardApplication.onCreate (JacquardApplication.java:850) android.app.Instrumentation.callApplicationOnCreate (Instrumentation.java:1024) android.app.ActivityThread.handleBindApplication (ActivityThread.java:5361) android.app.ActivityThread.-wrap2 (ActivityThread.java) android.app.ActivityThread$H.handleMessage (ActivityThread.java:1528) android.os.Handler.dispatchMessage (Handler.java:102) android.os.Looper.loop (Looper.java:154) android.app.ActivityThread.main (ActivityThread.java:6077) java.lang.reflect.Method.invoke (Method.java) com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:865) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:755)
我项目还依赖了其他的项目,可以在主项目与依赖项目之间通信吗?也可以说是模块之间通信,需要怎么做呢?感谢大神可以帮忙解答
Hello Team,
Recently i have updated my application to support android oreo , And we have changed support version to 26 and compile sdk version to 26.
At runtime we land up with issue from HermsEventBus , i.e ActionBarActivity def not found in TypeUtills.java
private static final HashSet<Class> CONTEXT_CLASSES = new HashSet>() {
{
add(Context.class);
add(ActionBarActivity.class);
add(Activity.class);
add(AppCompatActivity.class);
add(Application.class);
add(FragmentActivity.class);
add(IntentService.class);
add(Service.class);
}
};
Please let us know how to solve this problem , it seems they have removed ActionBarActivity from support libraries ,Previously it was deprecated.
Regards,
Anil Raavi.
com.china.epower.chat:remote W/HermesEventBus: Hermes service disconnected!
遇到这种情况有手动重连的方法吗?
所有的数据类型都可以么?接口和Context可以么?我试了下,没有成功。
请问库里面的 values.xml 中的 app_name
是否可以移除?会导致 manifest merger failed 。
使用hermesEventBus 框架,post 方法参数是string类型的不报错,但是使用了自定义的对象,报如下错误
01-12 16:07:27.103 12739-12761/xiaofei.library.hermeseventbustest E/HERMES_CALLBACK: Error occurs but does not crash the app.
android.os.DeadObjectException
at android.os.BinderProxy.transact(Native Method)
at xiaofei.library.hermes.internal.IHermesServiceCallback$Stub$Proxy.callback(IHermesServiceCallback.java:122)
at xiaofei.library.hermes.internal.HermesCallbackInvocationHandler.invoke(HermesCallbackInvocationHandler.java:57)
at java.lang.reflect.Proxy.invoke(Proxy.java:379)
at xiaofei.library.hermeseventbus.ISubService.post(ISubService.java)
at xiaofei.library.hermeseventbus.MainService.post(MainService.java:81)
at java.lang.reflect.Method.invoke(Native Method)
at xiaofei.library.hermes.receiver.ObjectReceiver.invokeMethod(ObjectReceiver.java:57)
at xiaofei.library.hermes.receiver.Receiver.action(Receiver.java:125)
at xiaofei.library.hermes.HermesService$1.send(HermesService.java:54)
at xiaofei.library.hermes.internal.IHermesService$Stub.onTransact(IHermesService.java:70)
at android.os.Binder.execTransact(Binder.java:404)
java.lang.RuntimeException: Unable to create application com.stub.StubApp: java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5677)
at android.app.ActivityThread.-wrap2(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1637)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:6523)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference
at xiaofei.library.hermeseventbus.HermesEventBus.b(SourceFile)
at xiaofei.library.hermeseventbus.HermesEventBus.a(SourceFile)
at xiaofei.library.hermeseventbus.HermesEventBus.init(SourceFile)
at com.****.Application.onCreate(SourceFile)
at com.stub.StubApp.onCreate(SourceFile:111)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1028)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5658)
... 8 more
java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference
at xiaofei.library.hermeseventbus.HermesEventBus.b(SourceFile)
at xiaofei.library.hermeseventbus.HermesEventBus.a(SourceFile)
at xiaofei.library.hermeseventbus.HermesEventBus.init(SourceFile)
at com..****Application.onCreate(SourceFile)
at com.stub.StubApp.onCreate(SourceFile:111)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1028)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5658)
at android.app.ActivityThread.-wrap2(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1637)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:6523)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
主app被杀死,但是子app程还存活的情况下,重启主app子app无法Connecte到主app了,如何解决呢
我在使用HermesEventBus的时候,当我打包之后自己反编译发现清单文件中多了许多权限的增加,还有一个HermesEventBus$Service的申明 ,这个原因直接导致在腾讯手机管家上面报毒了~可能申请了敏感的权限,我从多出的权限推测可能是SYSTEM_ALERT_WINDOW这个原因
android.os.DeadObjectException
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(Binder.java:496)
at xiaofei.library.hermes.internal.IHermesServiceCallback$Stub$Proxy.callback(IHermesServiceCallback.java:122)
at xiaofei.library.hermes.internal.HermesCallbackInvocationHandler.invoke(HermesCallbackInvocationHandler.java:57)
at java.lang.reflect.Proxy.invoke(Proxy.java:397)
at $Proxy6.post(Unknown Source)
at xiaofei.library.hermeseventbus.MainService.post(MainService.java:81)
at xiaofei.library.hermeseventbus.HermesEventBus$3.call(HermesEventBus.java:195)
at xiaofei.library.hermeseventbus.HermesEventBus$3.call(HermesEventBus.java:192)
at xiaofei.library.hermeseventbus.HermesEventBus.actionInternal(HermesEventBus.java:158)
at xiaofei.library.hermeseventbus.HermesEventBus.post(HermesEventBus.java:192)
HermesEventBus$Service 这个占用内存太大了 能不能优化一下。
Fatal Exception: java.lang.IllegalStateException: An error occurred in the GC.
at android.os.Parcel.readException(Parcel.java:1476)
at android.os.Parcel.readException(Parcel.java:1422)
at xiaofei.library.hermes.internal.IHermesService$Stub$Proxy.gc(IHermesService.java:168)
at xiaofei.library.hermes.internal.Channel.gc(Channel.java:240)
at xiaofei.library.hermes.util.HermesGc.gc(HermesGc.java:92)
at xiaofei.library.hermes.util.HermesGc.register(HermesGc.java:99)
at xiaofei.library.hermes.Hermes.getProxy(Hermes.java:97)
at xiaofei.library.hermes.Hermes.getInstanceWithMethodNameInService(Hermes.java:163)
at xiaofei.library.hermes.Hermes.getInstanceInService(Hermes.java:126)
at xiaofei.library.hermeseventbus.HermesEventBus$HermesListener.onHermesConnected(HermesEventBus.java:287)
at xiaofei.library.hermes.internal.Channel$HermesServiceConnection.onServiceConnected(Channel.java:284)
at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1151)
at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1168)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5333)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:895)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:711)
at dalvik.system.NativeStart.main(NativeStart.java)
APP中添加了一个 Service,并在mainfest中配置service为android:process=":TestService"。从service中POST事件,主界面可以正常收到消息。按返回键退出主界面后,再次打开无法收到消息。
想了一下,可能init是在主APP的application中初始化的不行,尝试在application中初始化,没有效果。
看init源码如下:
public void init(Context context) {
mContext = context.getApplicationContext();
mMainProcess = isMainProcess(context.getApplicationContext());
if (mMainProcess) {
Hermes.init(context);
Hermes.register(MainService.class);
mMainApis = MainService.getInstance();
} else {
mState = STATE_CONNECTING;
Hermes.setHermesListener(new HermesListener());
Hermes.connect(context, Service.class);
Hermes.register(SubService.class);
}
}
在Service中执行init时,mMmainProcess为false,也就是永远不能从服务来执行初始化,可是现实确是往往service的生命周期都比前台进程要长。
作者能不能指点一下,如何解决这个问题。
when you go inside of activity manager #getRunningAppProcesses can also return null, In such case following exception happens.Please have a look
Ref Links to solve the issue :
ACRA/acra#427
https://stackoverflow.com/questions/19631894/is-there-a-way-to-get-current-process-name-in-android/21389402#21389402
java.lang.RuntimeException: Unable to create application com.google.atap.jacquard.application.JacquardApplication: java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5364)
at android.app.ActivityThread.-wrap2(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1528)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference
at xiaofei.library.hermeseventbus.HermesEventBus.getCurrentProcessName(HermesEventBus.java:109)
at xiaofei.library.hermeseventbus.HermesEventBus.isMainProcess(HermesEventBus.java:101)
at xiaofei.library.hermeseventbus.HermesEventBus.init(HermesEventBus.java:119)
at com.google.atap.jacquard.application.JacquardApplication.onCreate(JacquardApplication.java:816)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1024)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5361)
... 8 more
When using HermesEventBus, these two debug messages could also include the process ID, as in android.os.Process.myPid()
D/EventBus: No subscribers registered for event class com.testapp..EventTest
D/EventBus: No subscribers registered for event class org.greenrobot.eventbus.NoSubscriberEvent
This would make it more clear that it's HermesEventBus and when there are multiple processes, why this message appears even when delivered.
EventBus不太适合用Hermes,因为EventBus只调用方法不需要返回值以及等待返回,aidl声明有个oneway关键字,执行aidl方法时候是不阻塞调用
绑定服务的时机,关于作者开一个服务,多个进程同时去通过aidl绑定这个服务发布事件这点非常好,但是绑定服务不应该是在init时候,而是在子进程发布事件,子进程注册事件的时候判断有没有绑定服务,没有连接就去绑定
发布事件,目前是发布一个跨进程的事件所有进程都接收,我觉得没有必要所有进程接收,post远程事件的时候多个processName的参数,发布事件到指定的进程。
EventBus用多了就乱,我觉得以接口的方式定义event,接收者实现这个接口,发布者通过这个接口发布事件,目前我实现了两种方式一种是动态代理自动实现使用者定义的接口,一种是apt的方式自动那个实现使用者定义的接口。
以上是个人建议,总的来说开一个服务,多个进程同时去通过aidl绑定这个服务发布事件这点想法很好
使用gradle的方式引入是好的,但是把源码搞到工程中,编译,就不能正常使用了
主进程间互相传递对象,没问题,主进程给其它进程post对象,会被解析成LinkedTreeMap
在一个应用里面,子进程(Service)发出的事件,主进程收得到,但是主进程发出的事件,子进程收不到。
接入后,一直在报NullPointerException
1.xiaofei.library.hermeseventbus.HermesEventBus$HermesListener.void onHermesConnected(java.lang.Class)(SourceFile:291)
xiaofei.library.hermes.internal.Channel$HermesServiceConnection.void onServiceConnected(android.content.ComponentName,android.os.IBinder)(SourceFile:288)
2.Attempt to invoke interface method 'void xiaofei.library.hermeseventbus.a.a(int, xiaofei.library.hermeseventbus.b)' on a null object reference
为什么会出现post一次事件,监听Activity会受到两次呢
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.