融云内容提供者

      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

相关文章
相关标签/搜索