package org.aisen.weibo.sina.support.cache; import android.text.TextUtils; import org.aisen.android.common.setting.Setting; import org.aisen.android.common.utils.KeyGenerator; import org.aisen.android.common.utils.Logger; import org.aisen.android.component.orm.extra.Extra; import org.aisen.android.network.biz.ABizLogic; import org.aisen.android.network.biz.IResult; import org.aisen.android.network.cache.ICacheUtility; import org.aisen.android.network.http.Params; import org.aisen.weibo.sina.base.AppContext; import org.aisen.weibo.sina.base.AppSettings; import org.aisen.weibo.sina.sinasdk.bean.StatusContent; import org.aisen.weibo.sina.sinasdk.bean.StatusContents; import org.aisen.weibo.sina.support.sqlit.SinaDB; import org.aisen.weibo.sina.support.utils.CacheTimeUtils; import java.util.List; public class TimelineCacheUtility implements ICacheUtility { static final String TAG = ABizLogic.TAG; public static String getCacheKey(Setting action, Params params) { String key = null; // 提及的微博 if (params.containsKey("filter_by_author")) key = action.getDescription() + ":" + action.getValue() + ":" + params.getParameter("filter_by_author"); else if (params.containsKey("filter_by_type")) key = action.getDescription() + ":" + action.getValue() + ":" + params.getParameter("filter_by_type"); // 好友分组微博 else if (params.containsKey("list_id")) key = action.getDescription() + ":" + action.getValue() + ":" + params.getParameter("list_id"); // 转发微博 else if (params.containsKey("id")) key = action.getDescription() + ":" + action.getValue() + ":" + params.getParameter("id"); // 默认分组微博 else key = action.getDescription() + ":" + action.getValue(); // key += AppContext.getUser().getIdstr(); if (params.containsKey("feature")) key += params.getParameter("feature"); return KeyGenerator.generateMD5(key); } @Override public IResult findCacheData(Setting action, Params params) { if (AppSettings.isDisableCache()) return null; if (!AppContext.isLoggedIn()) return null; // 如果是用户微博,只返回用户的微博 if (action.getValue().equals("statuses/user_timeline.json")) { // if (params.containsKey("feature")) { // return null; // } // 是当前登录用户 if (params.containsKey("user_id") && params.getParameter("user_id").equals(AppContext.getAccount().getUser().getIdstr())) { } else if (params.containsKey("screen_name") && params.getParameter("screen_name").equals(AppContext.getAccount().getUser().getScreen_name())) { } else { return null; } } try { long time = System.currentTimeMillis(); Extra extra = new Extra(AppContext.getAccount().getUser().getId(), getCacheKey(action, params)); List<StatusContent> statusList = SinaDB.getTimelineDB().select(extra, StatusContent.class); if (statusList.size() > 0) { StatusContents statusContents = new StatusContents(); statusContents.setFromCache(true); statusContents.setOutofdate(CacheTimeUtils.isOutofdate(getCacheKey(action, params), AppContext.getAccount().getUser())); statusContents.setStatuses(statusList); Logger.w(TAG, String.format("读取缓存耗时%sms", String.valueOf(System.currentTimeMillis() - time))); Logger.d(TAG, String.format("返回微博数据%d条, expired = %s", statusContents.getStatuses().size(), String.valueOf(statusContents.isOutofdate()))); return statusContents; } } catch (Exception e) { } return null; } @Override public void addCacheData(Setting action, Params params, IResult responseObj) { // 如果是离线请求,忽略数据缓存 if (action.getExtras() != null && action.getExtras().containsKey("offline_action")) return; // 如果是用户微博 if (action.getValue().equals("statuses/user_timeline.json")) { // if (params.containsKey("feature")) { // return; // } // 是当前登录用户 if (params.containsKey("user_id") && params.getParameter("user_id").equals(AppContext.getAccount().getUser().getIdstr())) { } else if (params.containsKey("screen_name") && params.getParameter("screen_name").equals(AppContext.getAccount().getUser().getScreen_name())) { } else { return; } } try { StatusContents statusContents = (StatusContents) responseObj; if (statusContents.getStatuses().size() == 0) return; boolean clear = false; // 刷新 if (!TextUtils.isEmpty(params.getParameter("since_id"))) { int diff = Math.abs(statusContents.getStatuses().size() - AppSettings.getTimelineCount()); clear = diff <= 3; } // 加载更多 else if (!TextUtils.isEmpty(params.getParameter("max_id"))) { } // 重置 else { clear = true; } Extra extra = new Extra(AppContext.getAccount().getUser().getId(), getCacheKey(action, params)); if (clear) { SinaDB.getTimelineDB().deleteAll(extra, StatusContent.class); Logger.d(TAG, "清理数据"); } long time = System.currentTimeMillis(); SinaDB.getTimelineDB().insert(extra, statusContents.getStatuses()); Logger.w(TAG, String.format("写入微博数据,共%d条,共耗时%sms", statusContents.getStatuses().size(), String.valueOf(System.currentTimeMillis() - time))); CacheTimeUtils.saveTime(getCacheKey(action, params), AppContext.getAccount().getUser()); } catch (Exception e) { e.printStackTrace(); } } }