2.4.1 View部分


  • GlobalView

    chatroom.view.xml:


    <bean name="ViewChatRoomInfo">
    	<variable name="name" type="string" />
    	<variable name="roomid" type="long" />
    </bean>
    
    <bean name="RoomChatHallInfo">
    	<variable name="name" type="string" />
    	<variable name="hallid" type="long" />
    	<variable name="rooms" type="vector" value="ViewChatRoomInfo" />
    </bean>
    
    <view name="CommonInfo" lifecycle="global">
    	<variable name="halls" type="vector" value="RoomChatHallInfo" />
    </view>
    

    这个GlobalView仅有1个字段halls,为RoomChatHallInfo的数组,提供了完整的聊天大厅和大厅内房间的信息。

    SessionManager.java:


    static void setViewHallsFromCache() {
    	final ArrayList<RoomChatHallInfo> halls = new ArrayList<>();
    	....................
    	CommonInfo.getInstance().setHalls(halls);
    	lastSetHallsTimeStamp = System.currentTimeMillis();
    }
    

    setViewHallsFromCache根据数据库配置信息构建halls数组, 设置到CommonInfo中, 这个方法在运行时调整了hall配置以后调用。该方法在系统初始化, 或者修改了大厅或房间配置以后调用。

    UserInfo.java:


    void checkUpdateHallInfos() {
    	if (updateroominfotime < SessionManager.lastSetHallsTimeStamp) {
    		updateroominfotime = System.currentTimeMillis();
    		CommonInfo.getInstance().syncToClient(getSessionId());
    	}
    }
    

    这个方法为当前用户检测客户端获得的hall信息是否最新版本,如果不是则将最新版本更新到客户端。

    搜索checkUpdateHallInfos的引用,可以发现,有3处调用。

    UserInfo.java:


    private UserInfo(SessionView.CreateParameter param) {
    	..............
    	checkUpdateHallInfos();
    }
    

    用户登录成功,创建SessionView时调用,初始化客户端hall信息,这个必然需要。

    UserInfo.java:


    protected void onMessage(String message, long sessionid) {
    	final int index = message.indexOf('=');
    	if (-1 == index)
    		return;
    	checkUpdateHallInfos();
    	...................
    }
    

    收到用户Message时,用户命令频率相对很低,检测一次无关紧要。

    ChatRoom.java:


    protected void onDetached(long sessionid, byte reason) {
            RoomInfo.increment_memberCount_mapkey(roomid, -1L);
            UserInfo info = UserInfo.getInstance(sessionid);
            if (info != null)
                    info.checkUpdateHallInfos();
    }
    

    用户离开聊天室,重新进入大厅,这个时候如果hall信息有改变,刷新一次理所当然。

    这里可以看出,GlobalView主要是为那些全局配置信息提供支持,这样的信息不需要改变以后立刻刷新,可以根据需求在特定的点手动刷新。


上一页 下一页