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.StatusComment; import org.aisen.weibo.sina.sinasdk.bean.StatusComments; import org.aisen.weibo.sina.sinasdk.bean.WeiBoUser; import org.aisen.weibo.sina.support.sqlit.SinaDB; import org.aisen.weibo.sina.support.utils.CacheTimeUtils; import java.util.ArrayList; import java.util.List; public class CommentCacheUtility implements ICacheUtility { private static final String TAG = ABizLogic.class.getSimpleName(); public static Extra getExtra(Params params, Setting action, WeiBoUser user) { String key = null; // 提及的评论 if (action.getValue().equals("comments/mentions.json")) key = action.getDescription() + ":" + action.getValue() + ":" + params.getParameter("filter_by_author"); // 我发出的、我收到的 else key = action.getDescription() + ":" + action.getValue() + ":all"; Extra extra = new Extra(user.getIdstr(), KeyGenerator.generateMD5(key)); return extra; } @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public IResult findCacheData(Setting action, Params params) { if (AppSettings.isDisableCache()) return null; if (!AppContext.isLoggedIn()) return null; try { long time = System.currentTimeMillis(); Extra extra = getExtra(params, action, AppContext.getAccount().getUser()); List<StatusComment> cmtList = SinaDB.getTimelineDB().select(extra, StatusComment.class); if (cmtList.size() > 0) { StatusComments cmts = new StatusComments(); cmts.setFromCache(true); cmts.setOutofdate(CacheTimeUtils.isOutofdate(getExtra(params, action, AppContext.getAccount().getUser()).getKey(), AppContext.getAccount().getUser())); cmts.setComments(cmtList); Logger.w(TAG, String.format("读取缓存耗时%sms", String.valueOf(System.currentTimeMillis() - time))); Logger.d(TAG, String.format("返回评论数据%d条, expired = %s", cmts.getComments().size(), String.valueOf(cmts.outofdate()))); return cmts; } } catch (Exception e) { } return null; } @Override public void addCacheData(Setting action, Params params, IResult result) { if (!AppContext.isLoggedIn()) return; try { StatusComments cmts = (StatusComments) result; List<StatusComment> newList = new ArrayList<StatusComment>(); boolean clear = false; // 刷新 if (!TextUtils.isEmpty(params.getParameter("since_id"))) { int diff = Math.abs(cmts.getComments().size() - AppSettings.getCommentCount()); clear = diff <= 3; } // 加载更多 else if (!TextUtils.isEmpty(params.getParameter("max_id"))) { } // 重置 else { clear = true; } Extra extra = getExtra(params, action, AppContext.getAccount().getUser()); long time = System.currentTimeMillis(); if (clear) { SinaDB.getTimelineDB().deleteAll(extra, StatusComment.class); Logger.d(TAG, "清理数据"); } SinaDB.getTimelineDB().insert(extra, cmts.getComments()); Logger.w(TAG, String.format("写入评论数据,共%d条,共耗时%sms", newList.size(), String.valueOf(System.currentTimeMillis() - time))); // 如果是重置数据,刷新缓存时间 if (!params.containsKey("max_id")) { CacheTimeUtils.saveTime(getExtra(params, action, AppContext.getAccount().getUser()).getKey(), AppContext.getAccount().getUser()); } } catch (Exception e) { } } }