浏览代码

试玩赚钱尝试加载缓存数据

zengjiebin 7 年之前
父节点
当前提交
ed3e5cc922

+ 1 - 1
app/src/main/java/com/kfzs/duanduan/fragment/FgtSmallSheep.java

@@ -355,7 +355,7 @@ public class FgtSmallSheep extends BaseCompatFragment implements SmallSheepContr
         for (int i = 0; i < 2; i++) {
             tryMakeMoneyAdp.add(RecyleObj.make(RecyleType.NONE, null));
         }
-        List<TaskAcceptedEty> cacheTaskAcceptedEtyList = CommonUtil.getInstance().getCacheList(ApiKey.new_run_task, TaskAcceptedEty.class);
+        List<TaskAcceptedEty> cacheTaskAcceptedEtyList = CommonUtil.getInstance().getCacheList(ApiKey.new_run_task(3), TaskAcceptedEty.class);
         if (ListUtil.isEmpty(cacheTaskAcceptedEtyList)) {//onResume中从网络获取
 
         } else {

+ 30 - 25
app/src/main/java/com/sheep/gamegroup/model/util/CacheInterceptor.java

@@ -30,7 +30,7 @@ public class CacheInterceptor implements Interceptor {
 
     public Response intercept(Chain chain) throws IOException {
         Request request = chain.request();
-        String key = request.url().toString().substring((SheepApp.getInstance().getConnectAddress().getAppUrl()+"v1/").length());
+        String key = request.url().toString();
 
         Response response;
         try {
@@ -40,32 +40,37 @@ public class CacheInterceptor implements Interceptor {
         }
 
         ResponseBody responseBody = response.body();
-        long contentLength = responseBody.contentLength();
-
-        if (HttpHeaders.hasBody(response)) {
-            if (this.bodyHasUnknownEncoding(response.headers())) {
-            } else {
-                BufferedSource source = responseBody.source();
-                source.request(9223372036854775807L);
-                Buffer buffer = source.buffer();
-
-                Charset charset = null;
-                MediaType contentType = responseBody.contentType();
-                if (contentType != null) {
-                    charset = contentType.charset(UTF8);
-                }
-                if (charset == null)
-                    charset = UTF8;
+        if(responseBody != null) {
+            long contentLength = responseBody.contentLength();
+
+            if (HttpHeaders.hasBody(response)) {
+                if (this.bodyHasUnknownEncoding(response.headers())) {
+                } else {
+                    BufferedSource source = responseBody.source();
+                    source.request(9223372036854775807L);
+                    Buffer buffer = source.buffer();
+
+                    Charset charset = null;
+                    MediaType contentType = responseBody.contentType();
+                    if (contentType != null) {
+                        charset = contentType.charset(UTF8);
+                    }
+                    if (charset == null)
+                        charset = UTF8;
 
-                if (!isPlaintext(buffer)) {
-                    return response;
-                }
+                    if (!isPlaintext(buffer)) {
+                        return response;
+                    }
 
-                if (contentLength != 0L) {
-                    String result = buffer.clone().readString(charset);
-                    if("GET".equals(request.method())){//缓存get数据
-                        LogUtil.println("sheepLog", "aCache", "key", "=", key);
-                        ACache.get(SheepApp.getInstance()).put(key, result);
+                    if (contentLength != 0L) {
+                        String result = buffer.clone().readString(charset);
+                        ACache aCache = ACache.get(SheepApp.getInstance());
+                        if (response.code() == 200 && "GET".equals(request.method())) {//成功则缓存get数据
+                            LogUtil.println("sheepLog", "aCache", "key", "=", key);
+                            aCache.put(key, result, 3600*24);//缓存一天
+                        } else {
+                            aCache.remove(key);
+                        }
                     }
                 }
             }

+ 38 - 13
app/src/main/java/com/sheep/gamegroup/util/CommonUtil.java

@@ -26,6 +26,7 @@ import com.arialyy.aria.core.inf.IEntity;
 import com.kfzs.duanduan.datashare.provider.download.DownLoadInfo;
 import com.kfzs.duanduan.event.BigEvent;
 import com.kfzs.duanduan.event.EventTypes;
+import com.kfzs.duanduan.utils.NumberFormatUtils;
 import com.sheep.gamegroup.absBase.BaseActivity;
 import com.sheep.gamegroup.alipay.PayResult;
 import com.sheep.gamegroup.model.api.BaseMessageConverter;
@@ -37,6 +38,7 @@ import com.sheep.gamegroup.model.entity.HomeListEntity;
 import com.sheep.gamegroup.model.entity.RecyleObj;
 import com.sheep.gamegroup.model.entity.RecyleType;
 import com.sheep.gamegroup.model.entity.RequestParameEty;
+import com.sheep.gamegroup.model.entity.TaskAcceptedEty;
 import com.sheep.gamegroup.model.entity.TaskChild;
 import com.sheep.gamegroup.model.entity.TaskDescEntity;
 import com.sheep.gamegroup.model.entity.TaskEty;
@@ -1374,31 +1376,54 @@ public class CommonUtil {
         return false;
     }
 
-    private ACache aCache;
     public <T> T getCacheResult(String key, Class<T> classT) {
-        if(aCache == null){
-            aCache = ACache.get(SheepApp.getInstance());
-        }
-        String cacheData = aCache.getAsString(key);
-        if(!TextUtils.isEmpty(cacheData)){
-            if(BuildConfig.XXTEA_ENCRYPT){
+        ACache aCache = ACache.get(SheepApp.getInstance());
+        String cacheData = aCache.getAsString(SheepApp.getInstance().getConnectAddress().getAppUrl() + "v1/" + key);
+        if (!TextUtils.isEmpty(cacheData)) {
+            if (BuildConfig.XXTEA_ENCRYPT) {
                 cacheData = BaseMessageConverter.decrypt(cacheData);
             }
             return JSON.parseObject(cacheData, BaseMessage.class).getData(classT);
         }
         return null;
     }
-    public <T> List<T> getCacheList(String key, Class<T> classT) {
-        if(aCache == null){
-            aCache = ACache.get(SheepApp.getInstance());
+    public void resetCacheTime(String key, int saveTime) {
+        ACache aCache = ACache.get(SheepApp.getInstance());
+        String realKey = SheepApp.getInstance().getConnectAddress().getAppUrl() + "v1/" + key;
+        String cacheData = aCache.getAsString(realKey);
+        if (!TextUtils.isEmpty(cacheData)) {
+            aCache.put(realKey, cacheData, saveTime);
         }
-        String cacheData = aCache.getAsString(key);
-        if(!TextUtils.isEmpty(cacheData)){
-            if(BuildConfig.XXTEA_ENCRYPT){
+    }
+
+    public <T> List<T> getCacheList(String key, Class<T> classT) {
+        ACache aCache = ACache.get(SheepApp.getInstance());
+        String cacheData = aCache.getAsString(SheepApp.getInstance().getConnectAddress().getAppUrl() + "v1/" + key);
+        if (!TextUtils.isEmpty(cacheData)) {
+            if (BuildConfig.XXTEA_ENCRYPT) {
                 cacheData = BaseMessageConverter.decrypt(cacheData);
             }
             return JSON.parseObject(cacheData, BaseMessage.class).getDataList(classT);
         }
         return null;
     }
+
+    /**
+     * 设置缓存数据的时间
+     * @param key
+     */
+    public void setSaveTime(String key) {
+        ACache aCache = ACache.get(SheepApp.getInstance());
+        aCache.put(key + "saveTime", String.valueOf(System.currentTimeMillis()));
+    }
+
+    /**
+     * 获取缓存数据的时间
+     * @param key
+     * @return
+     */
+    public long getSaveTime(String key) {
+        ACache aCache = ACache.get(SheepApp.getInstance());
+        return NumberFormatUtils.parseLong(aCache.getAsString(key + "saveTime"));
+    }
 }

+ 97 - 24
app/src/main/java/com/sheep/gamegroup/view/fragment/FgtTryMakeMoney.java

@@ -11,6 +11,7 @@ import android.view.ViewGroup;
 
 import com.alibaba.fastjson.JSONArray;
 import com.kfzs.duanduan.event.BigEvent;
+import com.kfzs.duanduan.utils.NumberFormatUtils;
 import com.sheep.gamegroup.di.components.DaggerFgtTryMakeMoneyComponent;
 import com.sheep.gamegroup.di.modules.TryMakeMoneyModule;
 import com.sheep.gamegroup.model.entity.BaseMessage;
@@ -23,6 +24,7 @@ import com.sheep.gamegroup.model.entity.TaskReleaseEty;
 import com.sheep.gamegroup.presenter.TryMakeMoneyContract;
 import com.sheep.gamegroup.presenter.TryMakeMoneyPresenter;
 import com.sheep.gamegroup.util.CommonUtil;
+import com.sheep.gamegroup.util.ListUtil;
 import com.sheep.gamegroup.view.activity.TryMakeMoneyact;
 import com.sheep.gamegroup.view.adapter.TryMakeMoneyAdp;
 import com.sheep.jiuyan.samllsheep.R;
@@ -30,6 +32,8 @@ import com.sheep.jiuyan.samllsheep.SheepApp;
 import com.sheep.jiuyan.samllsheep.base.BaseFragment;
 import com.sheep.jiuyan.samllsheep.utils.G;
 
+import org.afinal.simplecache.ACache;
+import org.afinal.simplecache.ApiKey;
 import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
 
@@ -61,10 +65,10 @@ public class FgtTryMakeMoney extends BaseFragment implements TryMakeMoneyContrac
     private TryMakeMoneyact activity;
     private TryMakeMoneyAdp tryMakeMoneyAdp;
     private int position = 0;
+    private List<TaskAcceptedEty> acceptedEtyList = new ArrayList<>();
     private List<TaskReleaseEty> releaseEtyLists = new ArrayList<>();
     private List<TaskReleaseEty> releaseEtyListsBegin = new ArrayList<>();
     private int type = 0;
-    private GridViewEntity gridViewEntity;//选中的
     private int is_succession;//0:一般任务 1:连续任务
 
     private void checkAndInitView() {
@@ -154,7 +158,7 @@ public class FgtTryMakeMoney extends BaseFragment implements TryMakeMoneyContrac
         refresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
             @Override
             public void onRefresh() {
-                initData();
+                refreshData();
             }
         });
         recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() {
@@ -173,14 +177,23 @@ public class FgtTryMakeMoney extends BaseFragment implements TryMakeMoneyContrac
             }
         });
     }
+    private boolean isFirstCache = false;//是否首先尝试缓存
+    //先尝试缓存数据,无缓存数据时,再尝试获取网络数据
+    public void initACacheData(){
+        isFirstCache = true;
+        mInitData();
+    }
+    //强制刷新数据
+    public void refreshData(){
+        isFirstCache = false;
+        mInitData();
+    }
     public void reFresh(){
-//        if(refresh.isRefreshing()){
-//            return;
-//        }
+        isFirstCache = false;
         refresh.setRefreshing(true);
-        initData();
+        mInitData();
     }
-    public void initData() {
+    public void mInitData() {
         empty_view.setVisibility(View.GONE);
         position = 0;
         type = 0;
@@ -191,9 +204,33 @@ public class FgtTryMakeMoney extends BaseFragment implements TryMakeMoneyContrac
             tryMakeMoneyAdp.add(RecyleObj.make(RecyleType.NONE, null));
         }
         tryMakeMoneyAdp.setIs_succession(is_succession);
-        gridViewEntity = activity.getTabValue();
-        if(activity instanceof  TryMakeMoneyact)
-            CommonUtil.getInstance().getRunTask(presenter,activity.getIsSuccession());
+
+        if(isFirstCache){
+            List<TaskAcceptedEty> cacheTaskAcceptedEtyList = CommonUtil.getInstance().getCacheList(ApiKey.new_run_task(is_succession), TaskAcceptedEty.class);
+            if (ListUtil.isEmpty(cacheTaskAcceptedEtyList)) {//本地无数据,从网络获取
+                CommonUtil.getInstance().getRunTask(presenter,is_succession);
+            } else {
+                //重新设置正在运行的任务的缓存时间
+                long saveTime = CommonUtil.getInstance().getSaveTime(TaskAcceptedEty.class.getSimpleName());
+                if(saveTime > 0)
+                    for (TaskAcceptedEty acceptedEty : cacheTaskAcceptedEtyList) {
+                        long newEndTime = acceptedEty.getEnd_time() - (System.currentTimeMillis() - saveTime) / 1000;
+                        if(newEndTime < 1){//有一个正在运行的任务的时间过期时,会刷新数据,不使用缓存
+                            mInitData();
+                            return;
+                        }
+                        acceptedEty.setEnd_time(newEndTime);//重置时间
+                    }
+                acceptedEtyList = cacheTaskAcceptedEtyList;
+                tryMakeMoneyAdp.add(RecyleObj.make(RecyleType.RUN_TASK, cacheTaskAcceptedEtyList),0);
+                tryMakeMoneyAdp.addPresenter(presenter);
+                position ++;
+
+                getNetWork(type);
+            }
+        } else {
+            CommonUtil.getInstance().getRunTask(presenter,is_succession);
+        }
     }
 
     @Override
@@ -261,6 +298,15 @@ public class FgtTryMakeMoney extends BaseFragment implements TryMakeMoneyContrac
             BaseMessage baseMessage = (BaseMessage) o;
             List<TaskAcceptedEty> taskAcceptedEty = JSONArray.parseArray(JSONArray.toJSONString(baseMessage.getData()), TaskAcceptedEty.class);
             if(taskAcceptedEty != null && taskAcceptedEty.size()>0){
+                //重新设置正在运行的任务的缓存时间
+                long minRunTime = 3600;//最多保存一个小时
+                CommonUtil.getInstance().setSaveTime(TaskAcceptedEty.class.getSimpleName());
+                for (TaskAcceptedEty acceptedEty : taskAcceptedEty) {
+                    minRunTime = Math.min(minRunTime, acceptedEty.getEnd_time());
+                }
+                CommonUtil.getInstance().resetCacheTime(ApiKey.new_run_task(is_succession), (int) minRunTime);
+
+                acceptedEtyList = taskAcceptedEty;
                 tryMakeMoneyAdp.add(RecyleObj.make(RecyleType.RUN_TASK, taskAcceptedEty),0);
                 tryMakeMoneyAdp.addPresenter(presenter);
                 position ++;
@@ -268,6 +314,7 @@ public class FgtTryMakeMoney extends BaseFragment implements TryMakeMoneyContrac
         }catch (Exception e){
             e.printStackTrace();
         }
+        isFirstCache = false;//有新的正在运行的任务时,强制更新
         getNetWork(type);
 //        notifyDataSetChanged();
     }
@@ -345,7 +392,7 @@ public class FgtTryMakeMoney extends BaseFragment implements TryMakeMoneyContrac
     public void onEventMainThread(BigEvent event){
         switch (event.getEventTypes()){
             case ONFRESH_TRYMAKEMANY_PAGE:
-//                reFresh();
+                reFresh();
                 break;
         }
     }
@@ -401,7 +448,7 @@ public class FgtTryMakeMoney extends BaseFragment implements TryMakeMoneyContrac
     public void onResume() {
         super.onResume();
         if (presenter != null) {
-            reFresh();
+            initACacheData();
         }
     }
 
@@ -424,20 +471,46 @@ public class FgtTryMakeMoney extends BaseFragment implements TryMakeMoneyContrac
      */
     private void getNetWork(int type){
         if(type > 1){
+            notifyDataSetChanged();
             return;
         }
+        if(isFirstCache){
+            List<TaskReleaseEty> cacheTaskReleaseEtyList = CommonUtil.getInstance().getCacheList(ApiKey.release_task(type, is_succession), TaskReleaseEty.class);
 
-        RequestParameEty parameEty = new RequestParameEty();
-        parameEty.setHashMap(
-                CommonUtil.getInstance()
-                        .setHashMap(1,
-                                100,
-                                SheepApp.getInstance().getConnectAddress().getPlatForm(),
-                                0,
-                                0,
-                                type,
-                                -1+"",
-                                activity.getIsSuccession()));
-        presenter.releaseTask(parameEty);
+            if(ListUtil.isEmpty(cacheTaskReleaseEtyList)) {//可以领取的任务
+                isFirstCache = false;
+                getNetWork(type);
+            } else{
+//                //删除缓存中已经存在的任务
+//                List<TaskReleaseEty> removeList = ListUtil.emptyList();
+//                for (TaskAcceptedEty taskAcceptedEty : acceptedEtyList) {
+//                    for (TaskReleaseEty taskReleaseEty : cacheTaskReleaseEtyList) {
+//                        if(taskAcceptedEty.getRelease_task_id() == taskReleaseEty.getId()){
+//                            removeList.add(taskReleaseEty);
+//                        }
+//                    }
+//                }
+//                cacheTaskReleaseEtyList.removeAll(removeList);
+                releaseEtyLists.addAll(cacheTaskReleaseEtyList);
+                tryMakeMoneyAdp.add(RecyleObj.make(RecyleType.RELEASE_TASK, releaseEtyLists), position);
+                position++;
+
+                type++;
+                getNetWork(type);
+            }
+        } else {
+            RequestParameEty parameEty = new RequestParameEty();
+            parameEty.setHashMap(
+                    CommonUtil.getInstance()
+                            .setHashMap(1,
+                                    100,
+                                    SheepApp.getInstance().getConnectAddress().getPlatForm(),
+                                    0,
+                                    0,
+                                    type,
+                                    -1 + "",
+                                    is_succession));
+            presenter.releaseTask(parameEty);
+        }
     }
 }

+ 9 - 2
app/src/main/java/org/afinal/simplecache/ApiKey.java

@@ -1,5 +1,7 @@
 package org.afinal.simplecache;
 
+import java.util.Locale;
+
 /**
  * Created by realicing on 2018/7/23.
  * realicing@sina.com
@@ -34,6 +36,11 @@ public class ApiKey {
     public static final String award_detail = "app/user/award_detail?page=0&per_page=100";
     //首页获取所有发布的热门任务(试玩任务、游戏任务、连续任务)
     public static final String release_task = "app/release_task?page=1&per_page=100&platform=1&is_hot=1&is_recommend=0&about_to_begin=0&task_type=-1&is_succession=3";
-    //首页获取正在运行的任务(试玩任务、游戏任务、连续任务)
-    public static final String new_run_task = "app/accepted_task/new_run_task/?is_succession=3";
+    public static String release_task(int type, int is_succession){
+        return String.format(Locale.CHINA, "app/release_task?page=1&per_page=100&platform=1&is_hot=0&is_recommend=0&about_to_begin=%d&task_type=-1&is_succession=%d", type, is_succession);
+    }
+    //获取正在运行的任务(试玩任务、游戏任务、连续任务)
+    public static String new_run_task(int is_succession){
+        return "app/accepted_task/new_run_task/?is_succession="+is_succession;
+    }
 }