房间在线列表优化,删除无用的贵族相关代码

This commit is contained in:
huangjian
2022-05-10 15:53:29 +08:00
parent 0849d7f33b
commit e37c56631a
12 changed files with 149 additions and 574 deletions

View File

@@ -4,7 +4,8 @@ import androidx.annotation.NonNull;
import com.chad.library.adapter.base.entity.MultiItemEntity;
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember;
import com.yizhuan.xchat_android_core.noble.NobleInfo;
import com.yizhuan.xchat_android_core.noble.NobleResourceType;
import com.yizhuan.xchat_android_core.noble.NobleUtil;
import com.yizhuan.xchat_android_core.user.bean.UserInfo;
import com.yizhuan.xchat_android_library.utils.ListUtils;
@@ -25,48 +26,42 @@ public class OnlineChatMember implements MultiItemEntity, Comparable<OnlineChatM
public static final int NOBLE = 1;
public static final int NORMAL = 4;
public static final int TEXT = 5;
public static final int SPAN_SIZE_NOBLE = 1;
public static final int SPAN_SIZE_NORMAL = 4;
public static final int SPAN_SIZE_TEXT = 4;
private int itemType;
private int spanSize;
public ChatRoomMember chatRoomMember;
public boolean isOnMic;
public boolean isAdmin;
public boolean isRoomOwer;
private boolean isOfficial;
/** 保存服务端数据 */
public String avatar;
public NobleInfo nobleUsers;
public String nick;
public int gender;
public long uid;
private int platformRole;
public OnlineChatMember() {
}
public OnlineChatMember(ChatRoomMember chatRoomMember, int itemType, int spanSize) {
public OnlineChatMember(ChatRoomMember chatRoomMember) {
this.chatRoomMember = chatRoomMember;
this.itemType = itemType;
this.spanSize = spanSize;
}
public OnlineChatMember(ChatRoomMember chatRoomMember, boolean isOnMic, boolean isAdmin,
boolean isRoomOwer, int itemType, int spanSize) {
boolean isRoomOwer) {
this.chatRoomMember = chatRoomMember;
this.isOnMic = isOnMic;
this.isAdmin = isAdmin;
this.isRoomOwer = isRoomOwer;
this.itemType = itemType;
this.spanSize = spanSize;
}
public static List<OnlineChatMember> coverToOnlineChatMember(List<ChatRoomMember> oldList, List<ChatRoomMember> newList) {
HashSet<OnlineChatMember> treeSet = new HashSet<>();
if (!ListUtils.isListEmpty(oldList)) {
List<OnlineChatMember> list = new ArrayList<>(oldList.size());
for (ChatRoomMember chatRoomMember : oldList) {
list.add(new OnlineChatMember(chatRoomMember));
}
treeSet.addAll(list);
}
if (!ListUtils.isListEmpty(newList)) {
List<OnlineChatMember> list = new ArrayList<>(newList.size());
for (ChatRoomMember chatRoomMember : newList) {
list.add(new OnlineChatMember(chatRoomMember));
}
treeSet.addAll(list);
}
ArrayList<OnlineChatMember> list = new ArrayList<>(treeSet);
Collections.sort(list);
return list;
}
@Override
@@ -84,38 +79,6 @@ public class OnlineChatMember implements MultiItemEntity, Comparable<OnlineChatM
return chatRoomMember.getAccount().hashCode();
}
public static List<OnlineChatMember> coverToOnlineChatMember(List<ChatRoomMember> oldList, List<ChatRoomMember> newList) {
int itemType = OnlineChatMember.NORMAL;
HashSet<OnlineChatMember> treeSet = new HashSet<>();
if (!ListUtils.isListEmpty(oldList)) {
List<OnlineChatMember> list = new ArrayList<>(oldList.size());
for (ChatRoomMember chatRoomMember : oldList) {
list.add(new OnlineChatMember(chatRoomMember, itemType, OnlineChatMember.SPAN_SIZE_NORMAL));
}
treeSet.addAll(list);
}
if (!ListUtils.isListEmpty(newList)) {
List<OnlineChatMember> list = new ArrayList<>(newList.size());
for (ChatRoomMember chatRoomMember : newList) {
list.add(new OnlineChatMember(chatRoomMember, itemType, OnlineChatMember.SPAN_SIZE_NORMAL));
}
treeSet.addAll(list);
}
ArrayList<OnlineChatMember> list = new ArrayList<>(treeSet);
Collections.sort(list);
return list;
}
public static List<ChatRoomMember> converOnlineToNormal(List<OnlineChatMember> onlineChatMembers) {
if (ListUtils.isListEmpty(onlineChatMembers)) return null;
List<ChatRoomMember> chatRoomMembers = new ArrayList<>();
for (OnlineChatMember temp : onlineChatMembers) {
if (temp.chatRoomMember == null) continue;
chatRoomMembers.add(temp.chatRoomMember);
}
return chatRoomMembers;
}
@Override
public int compareTo(@NonNull OnlineChatMember o) {
if (chatRoomMember == null) return 1;
@@ -123,41 +86,19 @@ public class OnlineChatMember implements MultiItemEntity, Comparable<OnlineChatM
return (int) (o.chatRoomMember.getEnterTime() - chatRoomMember.getEnterTime());
}
public void setItemType(int itemType) {
this.itemType = itemType;
}
@Override
public int getItemType() {
return itemType;
}
public int getSpanSize() {
return spanSize;
}
public void setSpanSize(int spanSize) {
this.spanSize = spanSize;
}
public static List<OnlineChatMember> newEmptyList(int size) {
List<OnlineChatMember> list = new ArrayList<>(size);
OnlineChatMember member;
for (int i = 0; i < size; i++) {
member = new OnlineChatMember(null, OnlineChatMember.NOBLE, OnlineChatMember.SPAN_SIZE_NOBLE);
member.nick = "贵族专属";
list.add(member);
Object isEnterHide = NobleUtil.getResource(NobleResourceType.KEY_ENTER_HIDE, chatRoomMember);
if ((isEnterHide instanceof Boolean && (Boolean) isEnterHide)
|| (isEnterHide instanceof String) && ((String) isEnterHide).equals("1")) {
return NOBLE;
}
return list;
}
public static OnlineChatMember newTextBean() {
return new OnlineChatMember(null,
OnlineChatMember.TEXT, OnlineChatMember.SPAN_SIZE_TEXT);
return NORMAL;
}
/**
* 判断是否为官方
*
* @return
*/
public boolean isOfficial() {
@@ -177,11 +118,4 @@ public class OnlineChatMember implements MultiItemEntity, Comparable<OnlineChatM
}
}
public int getPlatformRole() {
return platformRole;
}
public void setPlatformRole(int platformRole) {
this.platformRole = platformRole;
}
}

View File

@@ -1,37 +1,28 @@
package com.yizhuan.xchat_android_core.room.model;
import androidx.annotation.NonNull;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import com.netease.nimlib.sdk.chatroom.constant.MemberType;
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember;
import com.orhanobut.logger.Logger;
import com.yizhuan.xchat_android_core.Constants;
import com.yizhuan.xchat_android_core.auth.AuthModel;
import com.yizhuan.xchat_android_core.bean.RoomQueueInfo;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import com.yizhuan.xchat_android_core.exception.ErrorThrowable;
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
import com.yizhuan.xchat_android_core.manager.IMNetEaseManager;
import com.yizhuan.xchat_android_core.room.bean.OnlineChatMember;
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
import com.yizhuan.xchat_android_core.room.model.inteface.IHomePartyUserListModel;
import com.yizhuan.xchat_android_library.net.rxnet.RxNet;
import com.yizhuan.xchat_android_library.utils.ListUtils;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import io.reactivex.Single;
import io.reactivex.SingleOnSubscribe;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;
import retrofit2.http.GET;
import retrofit2.http.Query;
/**
* <p> 轰趴房用户列表网络处理 </p>
@@ -40,9 +31,6 @@ import retrofit2.http.Query;
* @date 2017/12/8
*/
public class HomePartyUserListModel extends RoomBaseModel implements IHomePartyUserListModel {
private static final int MAX_NOBLE_LIMIT = 60;
private final static int NOBLE_COLUM_NUM = 4;
/**
* 分页获取房间成员第一页包含队列成员固定成员游客50人之后每一页获取游客50人
@@ -51,70 +39,16 @@ public class HomePartyUserListModel extends RoomBaseModel implements IHomePartyU
* @param time 固定成员列表用updateTime,
* 游客列表用进入enterTime
* 填0会使用当前服务器最新时间开始查询即第一页单位毫秒
* @param isHomePartyOnline 是否是在轰趴房在线列表
*/
@Override
public Single<List<OnlineChatMember>> getOnLinePageMembers(final int page, long time,
final List<OnlineChatMember> oldList,
final boolean isHomePartyOnline) {
if (page == Constants.PAGE_START) {
Single<List<ChatRoomMember>> onlineUserObservable = queryOnlineList(500);
Single<List<ChatRoomMember>> firstGuestObservable = queryGuestList(ROOM_MEMBER_SIZE, 0);
Single<List<OnlineChatMember>> roomNobleUsersSingle = getRoomNobleUsers();
return Single.zip(onlineUserObservable, firstGuestObservable, roomNobleUsersSingle,
(onlineChatRoomMemberList, guestChatRoomMemberList, nobleOnlineChatMembers) ->
getChatRoomMemberList(onlineChatRoomMemberList, guestChatRoomMemberList,
isHomePartyOnline ? getNobleOnlineChatMembers(nobleOnlineChatMembers) : null))
.observeOn(AndroidSchedulers.mainThread());
} else {
return queryGuestList(ROOM_MEMBER_SIZE, time)
.map(chatRoomMemberList -> {
if (!ListUtils.isListEmpty(chatRoomMemberList)) {
Logger.i("第%1d页游客在线人数:%2d", page, chatRoomMemberList.size());
List<ChatRoomMember> list = null;
List<OnlineChatMember> nobleList = null;
if (!ListUtils.isListEmpty(oldList)) {
list = new ArrayList<>();
for (OnlineChatMember temp : oldList) {
int itemType = temp.getItemType();
if (itemType == OnlineChatMember.NORMAL) {
list.add(temp.chatRoomMember);
} else if (itemType == OnlineChatMember.NOBLE || itemType == OnlineChatMember.TEXT) {
if (nobleList == null)
nobleList = new ArrayList<>();
nobleList.add(temp);
}
}
}
return getChatRoomMemberList(list, chatRoomMemberList, nobleList);
}
return null;
})
.observeOn(AndroidSchedulers.mainThread());
}
}
/**
* 分页获取房间成员第一页包含队列成员固定成员游客50人之后每一页获取游客50人
*没有贵族调用此方法
* @param page 页数
* @param time 固定成员列表用updateTime,
* 游客列表用进入enterTime
* 填0会使用当前服务器最新时间开始查询即第一页单位毫秒
* @param isHomePartyOnline 是否是在轰趴房在线列表
*/
@Override
public Single<List<OnlineChatMember>> getPageMembers(final int page, long time,
final List<OnlineChatMember> oldList,
final boolean isHomePartyOnline) {
final List<OnlineChatMember> oldList) {
if (page == Constants.PAGE_START) {
Single<List<ChatRoomMember>> onlineUserObservable = queryOnlineList(500);
Single<List<ChatRoomMember>> firstGuestObservable = queryGuestList(ROOM_MEMBER_SIZE, 0);
return Single.zip(onlineUserObservable, firstGuestObservable,
(onlineChatRoomMemberList, guestChatRoomMemberList) ->
getChatRoomMemberList(onlineChatRoomMemberList, guestChatRoomMemberList,null))
this::getChatRoomMemberList)
.observeOn(AndroidSchedulers.mainThread());
} else {
return queryGuestList(ROOM_MEMBER_SIZE, time)
@@ -122,21 +56,13 @@ public class HomePartyUserListModel extends RoomBaseModel implements IHomePartyU
if (!ListUtils.isListEmpty(chatRoomMemberList)) {
Logger.i("第%1d页游客在线人数:%2d", page, chatRoomMemberList.size());
List<ChatRoomMember> list = null;
List<OnlineChatMember> nobleList = null;
if (!ListUtils.isListEmpty(oldList)) {
list = new ArrayList<>();
for (OnlineChatMember temp : oldList) {
int itemType = temp.getItemType();
if (itemType == OnlineChatMember.NORMAL) {
list.add(temp.chatRoomMember);
} else if (itemType == OnlineChatMember.NOBLE || itemType == OnlineChatMember.TEXT) {
if (nobleList == null)
nobleList = new ArrayList<>();
nobleList.add(temp);
}
list.add(temp.chatRoomMember);
}
}
return getChatRoomMemberList(list, chatRoomMemberList, null);
return getChatRoomMemberList(list, chatRoomMemberList);
}
return null;
})
@@ -144,78 +70,16 @@ public class HomePartyUserListModel extends RoomBaseModel implements IHomePartyU
}
}
private List<OnlineChatMember> getNobleOnlineChatMembers(List<OnlineChatMember> nobleOnlineChatMembers) {
ChatRoomMember tempChat;
//过滤超管
if (!ListUtils.isListEmpty(nobleOnlineChatMembers)) {
Iterator<OnlineChatMember> iterator = nobleOnlineChatMembers.iterator();
while (iterator.hasNext()) {
OnlineChatMember member = iterator.next();
if (member == null) {
continue;
}
if (member.getPlatformRole() == 1) {
iterator.remove();
}
}
}
if (!ListUtils.isListEmpty(nobleOnlineChatMembers)) {
int size = AvRoomDataManager.get().mMicQueueMemberMap.size();
for (OnlineChatMember onlineChatMember : nobleOnlineChatMembers) {
onlineChatMember.setItemType(OnlineChatMember.NOBLE);
onlineChatMember.setSpanSize(OnlineChatMember.SPAN_SIZE_NOBLE);
onlineChatMember.isOnMic = false;
for (int i = 0; i < size; i++) {
RoomQueueInfo roomQueueInfo = AvRoomDataManager.get().mMicQueueMemberMap.valueAt(i);
if (roomQueueInfo.mChatRoomMember != null
&& Objects.equals(roomQueueInfo.mChatRoomMember.getAccount(), String.valueOf(onlineChatMember.uid))) {
onlineChatMember.isOnMic = true;
}
}
onlineChatMember.isRoomOwer = AvRoomDataManager.get().isRoomOwner(onlineChatMember.uid);
onlineChatMember.isAdmin = AvRoomDataManager.get().isRoomAdmin(String.valueOf(onlineChatMember.uid));
//统一判断使用
tempChat = new ChatRoomMember();
tempChat.setAccount(String.valueOf(onlineChatMember.uid));
tempChat.setAvatar(onlineChatMember.avatar);
tempChat.setNick(onlineChatMember.nick);
onlineChatMember.chatRoomMember = tempChat;
}
int nobleSize = nobleOnlineChatMembers.size();
int alreadyHasSize = nobleSize % NOBLE_COLUM_NUM;
if (alreadyHasSize > 0) {
nobleOnlineChatMembers.addAll(OnlineChatMember.newEmptyList(NOBLE_COLUM_NUM - alreadyHasSize));
}
if (nobleOnlineChatMembers.size() >= MAX_NOBLE_LIMIT)
nobleOnlineChatMembers.add(OnlineChatMember.newTextBean());
} else {
nobleOnlineChatMembers = OnlineChatMember.newEmptyList(NOBLE_COLUM_NUM);
}
return nobleOnlineChatMembers;
}
@NonNull
private List<OnlineChatMember> getChatRoomMemberList(List<ChatRoomMember> oldList,
List<ChatRoomMember> newList,
List<OnlineChatMember> nobleList) {
List<ChatRoomMember> newList) {
long startTime = System.currentTimeMillis();
/* try {
Thread.sleep(12000);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
//处理耗时的循环
List<OnlineChatMember> allMemberList = OnlineChatMember.coverToOnlineChatMember(oldList, newList);
List<OnlineChatMember> part1MemberList = new ArrayList<>();
List<OnlineChatMember> limitMemberList = new ArrayList<>();
List<OnlineChatMember> managerMemberList = new ArrayList<>();
List<OnlineChatMember> normalMemberList = new ArrayList<>();
List<OnlineChatMember> onMicMemberList = new ArrayList<>();
@@ -264,8 +128,6 @@ public class HomePartyUserListModel extends RoomBaseModel implements IHomePartyU
} else if (memberType == MemberType.CREATOR) {
isRoomOwnerOnline = chatRoomMember.isOnline();
AvRoomDataManager.get().mRoomCreateMember = chatRoomMember;
} else if (chatRoomMember.isInBlackList() || chatRoomMember.isMuted()) {
limitMemberList.add(temp);
} else if (memberType == MemberType.NORMAL) {
normalMemberList.add(temp);
} else if (memberType == MemberType.GUEST) {
@@ -279,11 +141,11 @@ public class HomePartyUserListModel extends RoomBaseModel implements IHomePartyU
if (!ListUtils.isListEmpty(onMicMemberList)
&& !AvRoomDataManager.get().isRoomOwner(onMicMemberList.get(0).chatRoomMember.getAccount())) {
part1MemberList.add(0, new OnlineChatMember(AvRoomDataManager.get().mRoomCreateMember,
false, false, true, OnlineChatMember.NORMAL, OnlineChatMember.SPAN_SIZE_NORMAL));
false, false, true));
} else if (ListUtils.isListEmpty(onMicMemberList)) {
//处理麦上没有人的情况
part1MemberList.add(0, new OnlineChatMember(AvRoomDataManager.get().mRoomCreateMember,
false, false, true, OnlineChatMember.NORMAL, OnlineChatMember.SPAN_SIZE_NORMAL));
false, false, true));
}
}
}
@@ -306,39 +168,10 @@ public class HomePartyUserListModel extends RoomBaseModel implements IHomePartyU
part1MemberList.addAll(guestMemberList);
}
if (!ListUtils.isListEmpty(nobleList)) {
part1MemberList.addAll(0, nobleList);
}
Logger.i("循环处理在线顺序列表耗时:" + (System.currentTimeMillis() - startTime));
return part1MemberList;
}
/**
* 成员进来刷新在线列表
*
* @param account 进来成员的账号
* @param onlineChatMembers 成员列表
*/
@Override
public Single<List<OnlineChatMember>> onMemberInRefreshData(String account, int page,
final List<OnlineChatMember> onlineChatMembers) {
if (TextUtils.isEmpty(account)) return Single.error(new Throwable("account 不能为空"));
List<String> accounts = new ArrayList<>(1);
accounts.add(account);
return IMNetEaseManager.get().fetchRoomMembersByIds(accounts)
.observeOn(Schedulers.io())
.map(new Function<List<ChatRoomMember>, List<OnlineChatMember>>() {
@Override
public List<OnlineChatMember> apply(List<ChatRoomMember> chatRoomMemberList) throws Exception {
if (ListUtils.isListEmpty(chatRoomMemberList)) return onlineChatMembers;
return /*getChatRoomMemberList(chatRoomMemberList, OnlineChatMember.converOnlineToNormal(onlineChatMembers))*/onlineChatMembers;
}
})
.delay(page == Constants.PAGE_START ? 2 : 0, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread());
}
@Override
public Single<List<OnlineChatMember>> onMemberDownUpMic(final String account,
final boolean isUpMic,
@@ -385,37 +218,4 @@ public class HomePartyUserListModel extends RoomBaseModel implements IHomePartyU
.observeOn(AndroidSchedulers.mainThread());
}
/**
* 获取房间在线贵族列表
*/
private Single<List<OnlineChatMember>> getRoomNobleUsers() {
RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
if (roomInfo == null)
return Single.error(new ErrorThrowable(ErrorThrowable.ROOM_INFO_NULL_ERROR));
return RxNet.create(Service.class)
.getRoomNobleUsers(roomInfo.getUid(),
AuthModel.get().getCurrentUid(),
AuthModel.get().getTicket())
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.onErrorResumeNext(this.getSingleCommonExceptionFunction())
.flatMap(this.getSingleFunction());
}
private interface Service {
/**
* 获取房间在线贵族列表
*
* @param roomUid 房主uid
* @param uid 自己uid
* @param ticket -
* @return -
*/
@GET("noble/room/user/get")
Single<ServiceResult<List<OnlineChatMember>>> getRoomNobleUsers(@Query("roomUid") long roomUid,
@Query("uid") long uid,
@Query("ticket") String ticket);
}
}

View File

@@ -15,35 +15,11 @@ public interface IHomePartyUserListModel extends IModel {
* @param time 固定成员列表用updateTime,
* 游客列表用进入enterTime
* 填0会使用当前服务器最新时间开始查询即第一页单位毫秒
* @param isHomePartyOnline 是否是在轰趴房在线列表
*/
Single<List<OnlineChatMember>> getOnLinePageMembers(int page, long time,
List<OnlineChatMember> oldList,
boolean isHomePartyOnline);
/**
* 分页获取房间成员第一页包含队列成员固定成员游客50人之后每一页获取游客50人
*
* @param page 页数
* @param time 固定成员列表用updateTime,
* 游客列表用进入enterTime
* 填0会使用当前服务器最新时间开始查询即第一页单位毫秒
* @param isHomePartyOnline 是否是在轰趴房在线列表
*/
Single<List<OnlineChatMember>> getPageMembers(final int page, long time,
final List<OnlineChatMember> oldList,
final boolean isHomePartyOnline);
/**
* 成员进来刷新在线列表
*
* @param account 进来成员的账号
* @param onlineChatMembers 成员列表
*/
Single<List<OnlineChatMember>> onMemberInRefreshData(String account, int page,
final List<OnlineChatMember> onlineChatMembers);
List<OnlineChatMember> oldList);
;
Single<List<OnlineChatMember>> onMemberDownUpMic(final String account,
final boolean isUpMic,
final List<OnlineChatMember> dataList);

View File

@@ -41,6 +41,7 @@ public class UserInfo implements Serializable {
public static final transient int GENDER_MALE = 1;
public static final transient int GENDER_FEMALE = 2;
public static String IS_NEW_USER = "newUser";
public static String GENDER = "gender";
public static String IS_OFFICIAL = "official";
public static String DEF_USER = "defUser";
public static String HAS_PRETTY = "hasPrettyErbanNo";
@@ -577,6 +578,7 @@ public class UserInfo implements Serializable {
if (map == null) {
map = new HashMap<>();
}
map.put(GENDER, userInfo.getGender());
map.put(IS_OFFICIAL, userInfo.getDefUser() == USER_TYPE_OFFICIAL);
map.put(IS_NEW_USER, isNewUser());
map.put(DEF_USER, userInfo.getDefUser());