package com.example.lovetalk.service; import com.avos.avoscloud.AVException; import com.avos.avoscloud.AVQuery; import com.avos.avoscloud.AVUser; import com.avos.avoscloud.im.v2.AVIMConversation; import com.avos.avoscloud.im.v2.callback.AVIMConversationCallback; import com.avos.avoscloud.im.v2.callback.AVIMConversationQueryCallback; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** * Created by lzw on 14/12/19. */ public class CacheService { private static Map<String, AVIMConversation> cachedConvs = new ConcurrentHashMap<>(); private static Map<String, AVUser> cachedUsers = new ConcurrentHashMap<>(); private static volatile List<String> friendIds = new ArrayList<String>(); private static volatile String currentConversationId; public static AVUser lookupUser(String userId) { return cachedUsers.get(userId); } public static void registerUser(AVUser user) { cachedUsers.put(user.getObjectId(), user); } public static void registerUsers(List<AVUser> users) { for (AVUser user : users) { registerUser(user); } } public static AVIMConversation lookupConv(String convid) { return cachedConvs.get(convid); } public static void registerConvs(List<AVIMConversation> convs) { for (AVIMConversation conv : convs) { registerConv(conv); } } public static void registerConv(AVIMConversation conv) { cachedConvs.put(conv.getConversationId(), conv); } public static List<String> getFriendIds() { return friendIds; } public static AVIMConversation getCurrentConversation() { if (currentConversationId == null) { return null; } else { return lookupConv(currentConversationId); } } public static void setCurrentConversation(AVIMConversation currentConversation) { if (currentConversation != null) { registerConv(currentConversation); CacheService.currentConversationId = currentConversation.getConversationId(); } else { CacheService.currentConversationId = null; } } public static void cacheUsers(List<String> ids) throws AVException { Set<String> uncachedIds = new HashSet<String>(); for (String id : ids) { if (lookupUser(id) == null) { uncachedIds.add(id); } } List<AVUser> foundUsers = findUsers(new ArrayList<String>(uncachedIds)); registerUsers(foundUsers); } public static List<AVUser> findUsers(List<String> userIds) throws AVException { if (userIds.size() <= 0) { return Collections.EMPTY_LIST; } AVQuery<AVUser> q = AVUser.getQuery(); q.whereContainedIn("objectId", userIds); q.setLimit(1000); q.setCachePolicy(AVQuery.CachePolicy.NETWORK_ELSE_CACHE); return q.find(); } public static void cacheUserIfNone(String userId) throws AVException { if (lookupUser(userId) == null) { registerUser(UserService.findUser(userId)); } } }