IM中一定會用到用戶信息(id,暱稱,頭像等),本文參考融雲的內容提供者進行分析,參考起方式,咱們能夠實現本身的內容提供者。java
融雲的內容提供者相似於imageloader的三級緩存機制,要實現提供者(以User爲例),只需調用融雲的數據庫
RongIM.setUserInfoProvider(new RongIM.UserInfoProvider() { @Override public UserInfo getUserInfo(String s) { return null; } }, true);
其中的true表明是否啓用緩存。建議設置爲true。緩存
在須要用到User的地方,調用 ide
RongUserInfoManager.getInstance().getUserInfo(id)
RongUserInfoManager中:函數
public UserInfo getUserInfo(final String id) { if(id == null) { return null; } else { UserInfo info = null; if(this.mIsCacheUserInfo) { info = (UserInfo)this.mUserInfoCache.get(id); if(info == null) { this.mWorkHandler.post(new Runnable() { public void run() { synchronized(RongUserInfoManager.this.mUserQuerySet) { if(RongUserInfoManager.this.mUserQuerySet.contains(id)) { return; } RongUserInfoManager.this.mUserQuerySet.add(id); } UserInfo userInfo = null; if(RongUserInfoManager.this.mRongDatabaseDao != null) { userInfo = RongUserInfoManager.this.mRongDatabaseDao.getUserInfo(id); } if(userInfo == null) { if(RongUserInfoManager.this.mCacheListener != null) { userInfo = RongUserInfoManager.this.mCacheListener.getUserInfo(id); } if(userInfo != null) { RongUserInfoManager.this.putUserInfoInDB(userInfo); } } if(userInfo != null) { RongUserInfoManager.this.putUserInfoInCache(userInfo); if(RongUserInfoManager.this.mCacheListener != null) { RongUserInfoManager.this.mCacheListener.onUserInfoUpdated(userInfo); } } RongUserInfoManager.this.mUserQuerySet.remove(id); } }); } } else if(this.mCacheListener != null) { info = this.mCacheListener.getUserInfo(id); } return info; } }
mIsCacheUserInfo表明是否啓用緩存,即咱們前面設置的true。post
啓用,從mUserInfoCache中讀取,緩存類RongUserCache<K,V>,由LinkedHashMap實現。若info爲null,從數據庫中讀取,數據庫中爲空,則調用mCacheListener。而mCacheListener則是在登陸融雲成功以後在回調函數中調用RongUserInfoManager.init()方法中初始化。調用this.mCacheListener.getUserInfo(id),便可在第一段代碼中,從咱們本身的用戶關係中進行操做,找到對應的user,並返回。this
不啓用,則每次使用時,都要從咱們本身的用戶關係中進行操做。code