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