fix:修复断网时被踢,重连后未退房问题

This commit is contained in:
Max
2023-12-06 17:03:55 +08:00
parent 097ead1327
commit 07845b5e60
4 changed files with 99 additions and 6 deletions

View File

@@ -206,6 +206,7 @@ import io.reactivex.SingleSource;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.BiConsumer;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
import io.reactivex.functions.Predicate;
import io.reactivex.processors.PublishProcessor;
@@ -232,6 +233,9 @@ public final class IMNetEaseManager {
public RoomQueueInfo mCacheRoomQueueInfo;
private Disposable datingDisposable;
// 用于网络重连的判断
private boolean isNetBroken = false;
private IMNetEaseManager() {
roomProcessor = PublishProcessor.create();
relationShipProcessor = PublishProcessor.create();
@@ -421,9 +425,20 @@ public final class IMNetEaseManager {
}).subscribe();
}
private void registerOnlineStatusChange() {
Observer<ChatRoomStatusChangeData> onlineStatus = (Observer<ChatRoomStatusChangeData>) this::dealChatRoomOnlineStatus;
Observer<ChatRoomStatusChangeData> onlineStatus = chatRoomStatusChangeData -> {
if (chatRoomStatusChangeData.status == StatusCode.NET_BROKEN) {
isNetBroken = true;
}
boolean reconnection = false;
if (chatRoomStatusChangeData.status == StatusCode.LOGINED) {
if (isNetBroken) {
reconnection = true;
}
isNetBroken = false;
}
dealChatRoomOnlineStatus(chatRoomStatusChangeData, reconnection);
};
NIMChatRoomSDK.getChatRoomServiceObserve().observeOnlineStatus(onlineStatus, true);
}
@@ -481,9 +496,11 @@ public final class IMNetEaseManager {
msgStatusObserver, true);
}
private void dealChatRoomOnlineStatus(ChatRoomStatusChangeData chatRoomStatusChangeData) {
private void dealChatRoomOnlineStatus(ChatRoomStatusChangeData chatRoomStatusChangeData, boolean reconnection) {
if (filterAnotherChatRoom(chatRoomStatusChangeData)) return;
if (reconnection) {
tryCheckKickState();
}
long currentUid = AuthModel.get().getCurrentUid();
if (chatRoomStatusChangeData.status == StatusCode.CONNECTING) {
MLog.info(TAG, ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_06));
@@ -543,6 +560,38 @@ public final class IMNetEaseManager {
}
}
/**
* 尝试检测被踢状态(离线时被踢,重连后需要退出)
*/
@SuppressLint("CheckResult")
private void tryCheckKickState() {
String currentUid = AuthModel.get().getCurrentUid() + "";
if (currentUid.isEmpty() || currentUid.equals("0")) {
return;
}
if (AvRoomDataManager.get().mCurrentRoomInfo == null) {
return;
}
model.getKickList().subscribe(strings -> {
if (strings.isEmpty()) {
return;
}
RoomInfo currentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
if (currentRoomInfo == null) {
return;
}
long roomUid = currentRoomInfo.getRoomUid();
for (String uid : strings) {
if (uid != null && uid.equals(currentUid)) {
noticeKickOutChatMember(new ChatRoomKickOutEvent(roomUid + "", ChatRoomKickOutEvent.ChatRoomKickOutReason.KICK_OUT_BY_MANAGER.getValue(), null), currentUid);
// 清空緩存數據
AvRoomDataManager.get().release();
return;
}
}
});
}
private boolean needToHideEnterMessage(ChatRoomMessage chatRoomMessage) {
String resource = NobleUtil.getResource(NobleResourceType.KEY_ENTER_HIDE, chatRoomMessage);
if (resource.toLowerCase().equals("0")) {
@@ -2410,6 +2459,7 @@ public final class IMNetEaseManager {
@Override
public void onSuccess(Void param) {
e.onSuccess("踢人出房間回調成功");
model.kickUser(account).subscribe();
}
@Override

View File

@@ -701,4 +701,26 @@ public class AvRoomModel extends RoomBaseModel implements IAvRoomModel {
}
}
/**
* 获取踢人列表
* @return
*/
public Single<List<String>> getKickList() {
return mRoomService.getKickList(AvRoomDataManager.get().getRoomUid())
.compose(RxHelper.handleBeanData())
.compose(RxHelper.handleSchedulers());
}
/**
* 踢人
* @param uid
* @return
*/
public Single<String> kickUser(long uid) {
return mRoomService.kickUser(AvRoomDataManager.get().getRoomUid(),uid)
.compose(RxHelper.handleStringData())
.compose(RxHelper.handleSchedulers());
}
}

View File

@@ -1188,6 +1188,25 @@ public class RoomBaseModel extends BaseModel implements IRoomBaseModel {
@POST("/roomFirstChargeWindow/update")
Single<ServiceResult<String>> postFirstCharge(@Field("roomUid") long roomUid);
/**
* 踢人
*
* @param roomUid
* @return
*/
@FormUrlEncoded
@POST("/room/kick/")
Single<ServiceResult<String>> kickUser(@Field("roomUid") long roomUid, @Field("uid") long uid);
/**
* 获取踢人列表
*
* @param roomUid
* @return
*/
@GET("/room/kick/")
Single<ServiceResult<List<String>>> getKickList(@Query("roomUid") long roomUid);
}
}

View File

@@ -107,8 +107,10 @@ public class SAdminOptUtil {
}
ChatRoomMessage message = SaAttachmentFactory.createBlackOrKickOutChatRoomMsg(kickUid, nick, 3);
IMNetEaseManager.get().sendChatRoomMessage(message, false)
.doOnSuccess(chatRoomMessage ->
KickModel.get().onSendRoomMessageSuccess(chatRoomMessage))
.doOnSuccess(chatRoomMessage ->{
KickModel.get().onSendRoomMessageSuccess(chatRoomMessage);
AvRoomModel.get().kickUser(JavaUtil.str2long(kickUid)).subscribe();
})
.subscribe();
return true;
}