融雲內容提供者

      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

相關文章
相關標籤/搜索