Skip to content

Commit d202861

Browse files
committed
fix:系统通知,登录异步加载数据
1 parent a4b05c7 commit d202861

File tree

3 files changed

+98
-21
lines changed

3 files changed

+98
-21
lines changed

android/src/main/java/com/netease/im/RNNeteaseImModule.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ public void onResult(int code, Void aVoid, Throwable throwable) {
315315
}
316316
}
317317
});
318-
SysMessageObserver sysMessageObserver = new SysMessageObserver();
318+
SysMessageObserver sysMessageObserver = SysMessageObserver.getInstance();
319319
sysMessageObserver.loadMessages(false);
320320
sysMessageObserver.deleteSystemMessageById(contactId, false);
321321
}
@@ -1670,7 +1670,7 @@ public void stopPlay(Promise promise) {
16701670
* *****************************systemMsg 系统通知******************************************
16711671
**/
16721672

1673-
SysMessageObserver sysMessageObserver = new SysMessageObserver();
1673+
SysMessageObserver sysMessageObserver = SysMessageObserver.getInstance();
16741674

16751675
/**
16761676
* 进入系统通知消息
@@ -1679,7 +1679,7 @@ public void stopPlay(Promise promise) {
16791679
*/
16801680
@ReactMethod
16811681
public void startSystemMsg(Promise promise) {
1682-
sysMessageObserver = new SysMessageObserver();
1682+
sysMessageObserver = SysMessageObserver.getInstance();
16831683
sysMessageObserver.startSystemMsg();
16841684
}
16851685

android/src/main/java/com/netease/im/login/LoginService.java

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import android.app.NotificationManager;
44
import android.content.Context;
5+
import android.os.AsyncTask;
56

67
import com.netease.im.IMApplication;
78
import com.netease.im.ReactCache;
@@ -66,7 +67,7 @@ public LoginInfo getLoginInfo(Context context) {
6667
}
6768

6869
void initLogin(LoginInfo loginInfo) {
69-
DataCacheManager.buildDataCacheAsync();
70+
7071
}
7172

7273
public void login(LoginInfo loginInfo, final RequestCallback<LoginInfo> callback) {
@@ -79,8 +80,7 @@ public void onSuccess(LoginInfo loginInfo) {
7980
callback.onSuccess(loginInfo);
8081

8182
registerObserver(true);
82-
queryRecentContacts();
83-
startSystemMsgUnreadCount();
83+
startLogin();
8484
loginInfoFuture = null;
8585
}
8686

@@ -103,6 +103,21 @@ public void onException(Throwable exception) {
103103
}
104104

105105

106+
private void startLogin() {
107+
new AsyncTask<Object, Object, Object>() {
108+
109+
@Override
110+
protected Object doInBackground(Object[] params) {
111+
DataCacheManager.buildDataCacheAsync();
112+
SysMessageObserver.getInstance().loadMessages(false);
113+
queryRecentContacts();
114+
startSystemMsgUnreadCount();
115+
return null;
116+
}
117+
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
118+
119+
}
120+
106121
private void queryRecentContacts() {
107122
recentContactObserver.queryRecentContacts();
108123
}
@@ -122,14 +137,15 @@ synchronized void registerObserver(boolean register) {
122137
// sysMessageObserver.registerSystemObserver(register);
123138
// NIMClient.getService(SystemMessageObserver.class).observeReceiveSystemMsg(systemMessageObserver, register);
124139
NIMClient.getService(MsgServiceObserve.class).observeCustomNotification(notificationObserver, register);
140+
SysMessageObserver.getInstance().register(register);
125141
}
126142

127143
private NotificationManager notificationManager;
128144
private Observer<CustomNotification> notificationObserver = new Observer<CustomNotification>() {
129145
@Override
130146
public void onEvent(CustomNotification customNotification) {
131147

132-
SessionUtil.receiver(getNotificationManager(),customNotification);
148+
SessionUtil.receiver(getNotificationManager(), customNotification);
133149
}
134150
};
135151

@@ -168,11 +184,12 @@ public void logout() {
168184
LoginSyncDataStatusObserver.getInstance().reset();
169185
}
170186

171-
public void startSystemMsgUnreadCount(){
187+
public void startSystemMsgUnreadCount() {
172188
registerSystemMsgUnreadCount(true);
173189
int unread = NIMClient.getService(SystemMessageService.class).querySystemMessageUnreadCountBlock();
174190
ReactCache.emit(ReactCache.observeUnreadCountChange, Integer.toString(unread));
175191
}
192+
176193
boolean hasRegisterSystemMsgUnreadCount;
177194
private Observer<Integer> sysMsgUnreadCountChangedObserver = new Observer<Integer>() {
178195
@Override

android/src/main/java/com/netease/im/login/SysMessageObserver.java

Lines changed: 73 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,18 @@
3030
public class SysMessageObserver {
3131

3232
final static String TAG = "SysMessageObserver";
33+
34+
static class InstanceHolder {
35+
final static SysMessageObserver instance = new SysMessageObserver();
36+
}
37+
38+
private SysMessageObserver() {
39+
}
40+
41+
public static SysMessageObserver getInstance() {
42+
return InstanceHolder.instance;
43+
}
44+
3345
/*******************************系统消息********************************/
3446

3547
private static final boolean MERGE_ADD_FRIEND_VERIFY = true; // 是否要合并好友申请,同一个用户仅保留最近一条申请内容(默认不合并)
@@ -41,6 +53,7 @@ public class SysMessageObserver {
4153
private Set<String> addFriendVerifyRequestAccounts = new HashSet<>(); // 发送过好友申请的账号(好友申请合并用)
4254

4355
private Set<Long> itemIds = new HashSet<>();
56+
private List<Observer<SystemMessage>> observerList = new ArrayList<>();
4457

4558
// db
4659
private boolean firstLoad = true;
@@ -53,6 +66,7 @@ public void loadMessages(boolean refresh) {
5366
int validMessageCount = 0; // 实际加载的数量(排除被过滤被合并的条目)
5467
List<String> messageFromAccounts = new ArrayList<>(LOAD_MESSAGE_COUNT);
5568

69+
List<SystemMessage> deleteList = new ArrayList<>();
5670
while (true) {
5771
List<SystemMessage> temps = NIMClient.getService(SystemMessageService.class)
5872
.querySystemMessagesBlock(loadOffset, LOAD_MESSAGE_COUNT);
@@ -73,7 +87,7 @@ public void loadMessages(boolean refresh) {
7387

7488
// 同一个账号的好友申请仅保留最近一条
7589
if (addFriendVerifyFilter(m)) {
76-
NIMClient.getService(SystemMessageService.class).deleteSystemMessage(m.getMessageId());//删除旧的加好友通知
90+
deleteList.add(m);
7791
continue;
7892
}
7993

@@ -100,6 +114,13 @@ public void loadMessages(boolean refresh) {
100114
}
101115
}
102116
firstLoad = false;
117+
if (!deleteList.isEmpty()) {
118+
for (SystemMessage m : deleteList) {
119+
NIMClient.getService(SystemMessageService.class).deleteSystemMessage(m.getMessageId());//删除旧的加好友通知
120+
}
121+
loadOffset -= deleteList.size();
122+
deleteList.clear();
123+
}
103124
// 更新数据源,刷新界面
104125
if (refresh)
105126
refresh();
@@ -110,46 +131,84 @@ public void loadMessages(boolean refresh) {
110131

111132
boolean hasRegister;
112133

134+
public void register(boolean register) {
135+
136+
NIMClient.getService(SystemMessageObserver.class).observeReceiveSystemMsg(baseSystemMessageObserver, register);
137+
registerSystemObserver(new Observer<SystemMessage>() {
138+
@Override
139+
public void onEvent(SystemMessage systemMessage) {
140+
if (hasRegister) {
141+
return;
142+
}
143+
onIncomingMessage(systemMessage, false);
144+
}
145+
}, register);
146+
}
147+
113148
public void registerSystemObserver(boolean register) {
114149
if (hasRegister && register) {
115150
return;
116151
}
117152
hasRegister = register;
118-
NIMClient.getService(SystemMessageObserver.class).observeReceiveSystemMsg(systemMessageObserver, register);
153+
registerSystemObserver(systemMessageObserver, register);
119154
}
120155

156+
public void registerSystemObserver(Observer<SystemMessage> o, boolean register) {
157+
if (o == null) {
158+
return;
159+
}
160+
161+
if (register) {
162+
if (!observerList.contains(o)) {
163+
observerList.add(o);
164+
}
165+
} else {
166+
observerList.remove(o);
167+
}
168+
169+
}
170+
171+
private Observer<SystemMessage> baseSystemMessageObserver = new Observer<SystemMessage>() {
172+
@Override
173+
public void onEvent(SystemMessage systemMessage) {
174+
for (Observer<SystemMessage> o : observerList) {
175+
o.onEvent(systemMessage);
176+
}
177+
}
178+
};
121179
private Observer<SystemMessage> systemMessageObserver = new Observer<SystemMessage>() {
122180
@Override
123181
public void onEvent(SystemMessage systemMessage) {
124-
onIncomingMessage(systemMessage);
182+
onIncomingMessage(systemMessage, true);
125183
}
126184
};
127185

128186

129-
private void onIncomingMessage(final SystemMessage message) {
187+
private void onIncomingMessage(final SystemMessage message, boolean refresh) {
130188
// 同一个账号的好友申请仅保留最近一条
189+
SystemMessage del = null;
131190
if (addFriendVerifyFilter(message)) {
132-
SystemMessage del = null;
133191
for (SystemMessage m : sysItems) {
134192
if (TextUtils.equals(m.getFromAccount(), message.getFromAccount()) && m.getType() == SystemMessageType.AddFriend) {
135193
AddFriendNotify attachData = (AddFriendNotify) m.getAttachObject();
136194
if (attachData != null && attachData.getEvent() == AddFriendNotify.Event.RECV_ADD_FRIEND_VERIFY_REQUEST) {
137195
del = m;
138-
NIMClient.getService(SystemMessageService.class).deleteSystemMessage(m.getMessageId());//删除旧的加好友通知
139196
break;
140197
}
141198
}
142199
}
143-
144-
if (del != null) {
145-
sysItems.remove(del);
146-
}
200+
}
201+
if (del != null) {
202+
sysItems.remove(del);
203+
NIMClient.getService(SystemMessageService.class).deleteSystemMessage(del.getMessageId());//删除旧的加好友通知
204+
} else {
205+
loadOffset++;
147206
}
148207

149-
loadOffset++;
150208
sysItems.add(0, message);
151209

152-
refresh();
210+
if (refresh)
211+
refresh();
153212

154213
// 收集未知用户资料的账号集合并从远程获取
155214
List<String> messageFromAccounts = new ArrayList<>(1);
@@ -229,6 +288,7 @@ private void refresh() {
229288
public void startSystemMsg() {
230289
loadMessages(true);
231290
registerSystemObserver(true);
291+
NIMClient.getService(SystemMessageService.class).resetSystemMessageUnreadCount();
232292
}
233293

234294
public void stopSystemMsg() {
@@ -334,7 +394,7 @@ private void onProcessFailed(final int code, long messageId) {
334394
}
335395

336396
SystemMessageStatus status = SystemMessageStatus.expired;
337-
NIMClient.getService(SystemMessageService.class).setSystemMessageRead(messageId);
397+
// NIMClient.getService(SystemMessageService.class).setSystemMessageRead(messageId);
338398
NIMClient.getService(SystemMessageService.class).setSystemMessageStatus(messageId, status);
339399
refreshViewHolder(messageId, status);
340400
}

0 commit comments

Comments
 (0)