1
1
/*
2
2
* ************************************************************
3
3
* 文件:ProcessManager.java 模块:ElegantBus.ipc 项目:ElegantBus
4
- * 当前修改时间:2023年06月01日 17:08:51
5
- * 上次修改时间:2023年06月01日 10:29:02
4
+ * 当前修改时间:2023年06月06日 11:07:31
5
+ * 上次修改时间:2023年06月06日 10:40:09
6
6
* 作者:Cody.yi https://github.com/codyer
7
7
*
8
8
* 描述:ElegantBus.ipc
15
15
import android .os .RemoteCallbackList ;
16
16
import android .os .RemoteException ;
17
17
18
- import java .util .Map ;
19
- import java .util .concurrent .ConcurrentHashMap ;
18
+ import java .util .List ;
19
+
20
+ import cody .bus .db .EventBean ;
21
+ import cody .bus .db .EventDataBase ;
20
22
21
23
/**
22
24
* 多进程共享一个实例
23
25
*/
24
26
public class ProcessManager extends IProcessManager .Stub {
25
- private final Map <String , EventWrapper > mEventCache = new ConcurrentHashMap <>();
26
27
private final RemoteCallbackList <IProcessCallback > mRemoteCallbackList = new RemoteCallbackList <>();
27
28
28
29
public static MultiProcess ready () {
@@ -32,6 +33,10 @@ public static MultiProcess ready() {
32
33
return BusFactory .getDelegate ();
33
34
}
34
35
36
+ public ProcessManager () {
37
+ ElegantLog .d ("ProcessManager is initialized." );
38
+ }
39
+
35
40
@ Override
36
41
public void register (IProcessCallback callback ) throws RemoteException {
37
42
mRemoteCallbackList .register (callback );
@@ -46,15 +51,19 @@ public void unregister(IProcessCallback callback) {
46
51
}
47
52
48
53
@ Override
49
- public void resetSticky (final EventWrapper eventWrapper ) throws RemoteException {
50
- removeEventFromCache (eventWrapper );
51
- callbackToOtherProcess (eventWrapper , MultiProcess .MSG_ON_RESET_STICKY );
54
+ public void resetSticky (final EventWrapper eventWrapper ) {
55
+ BusFactory .ready ().getSingleExecutorService ().execute (() -> {
56
+ removeEventFromCache (eventWrapper );
57
+ callbackToOtherProcess (eventWrapper , MultiProcess .MSG_ON_RESET_STICKY );
58
+ });
52
59
}
53
60
54
61
@ Override
55
- public void postToProcessManager (final EventWrapper eventWrapper ) throws RemoteException {
56
- putEventToCache (eventWrapper );
57
- callbackToOtherProcess (eventWrapper , MultiProcess .MSG_ON_POST );
62
+ public void postToProcessManager (final EventWrapper eventWrapper ) {
63
+ BusFactory .ready ().getSingleExecutorService ().execute (() -> {
64
+ putEventToCache (eventWrapper );
65
+ callbackToOtherProcess (eventWrapper , MultiProcess .MSG_ON_POST );
66
+ });
58
67
}
59
68
60
69
/**
@@ -64,7 +73,7 @@ public void postToProcessManager(final EventWrapper eventWrapper) throws RemoteE
64
73
*/
65
74
private void putEventToCache (final EventWrapper eventWrapper ) {
66
75
ElegantLog .d ("Service receive event, add to cache, Event = " + eventWrapper .toString ());
67
- mEventCache . put ( eventWrapper . getKey (), eventWrapper );
76
+ EventDataBase . getInstance (). eventDao (). insert ( DataUtil . convert ( eventWrapper ) );
68
77
}
69
78
70
79
/**
@@ -74,27 +83,31 @@ private void putEventToCache(final EventWrapper eventWrapper) {
74
83
*/
75
84
private void removeEventFromCache (final EventWrapper eventWrapper ) {
76
85
ElegantLog .d ("Service receive event, remove from cache, Event = " + eventWrapper .toString ());
77
- mEventCache . remove ( eventWrapper . getKey ( ));
86
+ EventDataBase . getInstance (). eventDao (). delete ( DataUtil . convert ( eventWrapper ));
78
87
}
79
-
88
+
80
89
/**
81
90
* 转发事件总线
82
91
*
83
92
* @param eventWrapper 发送值
84
- * @throws RemoteException 异常
85
93
*/
86
- private void callbackToOtherProcess (EventWrapper eventWrapper , int what ) throws RemoteException {
94
+ private void callbackToOtherProcess (EventWrapper eventWrapper , int what ) {
87
95
int count = mRemoteCallbackList .beginBroadcast ();
88
- for (int i = 0 ; i < count ; i ++) {
89
- IProcessCallback callback = mRemoteCallbackList .getBroadcastItem (i );
90
- if (callback == null ) continue ;
91
- if (ElegantUtil .isSameProcess (callback .processName (), eventWrapper .processName )) {
92
- ElegantLog .d ("This is in same process, already posted, Event = " + eventWrapper );
93
- } else {
94
- ElegantLog .d ("call back " + what + " to other process : " + callback .processName () + ", Event = " +
95
- eventWrapper );
96
- callback .call (eventWrapper , what );
96
+ try {
97
+ for (int i = 0 ; i < count ; i ++) {
98
+ IProcessCallback callback = mRemoteCallbackList .getBroadcastItem (i );
99
+ if (callback == null ) continue ;
100
+ if (ElegantUtil .isSameProcess (callback .processName (), eventWrapper .processName )) {
101
+ ElegantLog .d ("This is in same process, already posted, Event = " + eventWrapper );
102
+ } else {
103
+ ElegantLog .d ("call back " + what + " to other process : " + callback .processName () + ", Event = " +
104
+ eventWrapper );
105
+
106
+ callback .call (eventWrapper , what );
107
+ }
97
108
}
109
+ } catch (RemoteException e ) {
110
+ e .printStackTrace ();
98
111
}
99
112
mRemoteCallbackList .finishBroadcast ();
100
113
}
@@ -103,12 +116,18 @@ private void callbackToOtherProcess(EventWrapper eventWrapper, int what) throws
103
116
* 转发 粘性事件到新的进程
104
117
*
105
118
* @param callback 进程回调
106
- * @throws RemoteException 异常
107
119
*/
108
- private void postStickyValueToNewProcess (final IProcessCallback callback ) throws RemoteException {
109
- ElegantLog .d ("Post all sticky event to new process : " + callback .processName ());
110
- for (EventWrapper item : mEventCache .values ()) {
111
- callback .call (item , MultiProcess .MSG_ON_POST_STICKY );
112
- }
120
+ private void postStickyValueToNewProcess (final IProcessCallback callback ) {
121
+ BusFactory .ready ().getSingleExecutorService ().execute (() -> {
122
+ try {
123
+ ElegantLog .d ("Post all sticky event to new process : " + callback .processName ());
124
+ List <EventBean > caches = EventDataBase .getInstance ().eventDao ().getAllList ();
125
+ for (EventBean item : caches ) {
126
+ callback .call (DataUtil .convert (item ), MultiProcess .MSG_ON_POST_STICKY );
127
+ }
128
+ } catch (RemoteException e ) {
129
+ e .printStackTrace ();
130
+ }
131
+ });
113
132
}
114
133
}
0 commit comments