fix:修复断网时被踢,重连后未退房问题
This commit is contained in:
@@ -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
|
||||
|
@@ -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());
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user