瀏覽代碼

[검색][New] 캐쉬 SoftReference 적용

hyodong.min 6 年之前
父節點
當前提交
c12f4ab111

+ 27 - 24
app/src/main/java/kr/co/zumo/app/lifeplus/model/module/APISearchModule.java

@@ -5,11 +5,11 @@ package kr.co.zumo.app.lifeplus.model.module;
 
 import android.util.Log;
 
+import java.lang.ref.SoftReference;
 import java.util.ArrayList;
 import java.util.List;
 
 import io.reactivex.Single;
-import io.reactivex.functions.Consumer;
 import kr.co.zumo.app.lifeplus.bean.api.CategoryBean;
 import kr.co.zumo.app.lifeplus.bean.api.LifeplusAPIBean;
 import kr.co.zumo.app.lifeplus.bean.api.SearchContentsBean;
@@ -31,9 +31,9 @@ import kr.co.zumo.app.lifeplus.util.StringUtil;
  */
 public class APISearchModule extends LifeplusAPIModule<SearchRequestBean, SearchResultBean> {
 
-  private static List<SearchContentsBean> searchContentsBeans;
-  private static List<TagBean> tagBeans;
-  private static List<CategoryBean> categoryBeans;
+  private static SoftReference<List<SearchContentsBean>> searchContentsReference;
+  private static SoftReference<List<TagBean>> tagReference;
+  private static SoftReference<List<CategoryBean>> categoryReference;
   private static String keyword;
   private static String order;
 
@@ -44,9 +44,15 @@ public class APISearchModule extends LifeplusAPIModule<SearchRequestBean, Search
 
     // 기본 데이터(필터/정렬 없이 전체 데이터, 동일 키워드, 동일 정렬)라면 캐쉬에서 리턴
     // 키워드 동일
-    if (null != searchContentsBeans && StringUtil.isEmpty(filters) && null != keyword && keyword.equals(requestBean.getKeyword())
+    if (null != searchContentsReference && null != tagReference && null != categoryReference
+      && null != searchContentsReference.get() && null != tagReference.get() && null != categoryReference.get()
+      && StringUtil.isEmpty(filters) && null != keyword && keyword.equals(requestBean.getKeyword())
       // 정렬이 없거나, 이전과 정렬이 같다면
       && ((null == order && null == requestBean.getOrder()) || (null != order && order.equals(requestBean.getOrder())))) {
+
+      List<TagBean> tags = new ArrayList<>(tagReference.get());
+      List<CategoryBean> categories = new ArrayList<>(categoryReference.get());
+      List<SearchContentsBean> searchContentsBeans = searchContentsReference.get();
       // 필터가 없을 때만 적용
       List<SearchContentsBean> list = new ArrayList<>();
       if (StringUtil.isEmpty(categoryNo)) {
@@ -66,14 +72,12 @@ public class APISearchModule extends LifeplusAPIModule<SearchRequestBean, Search
       }
 
       if (list.size() > 0) {
-        Log.e("APP# APISearchModule | getAPI", "|" + " ************** cache return ***************");
+        Log.w("APP# APISearchModule | getAPI", "|" + " -------------------- cache return --------------------");
         return Single.fromCallable(() -> {
-          List<TagBean> tags = new ArrayList<>(tagBeans);
-          List<CategoryBean> categoryBeans = new ArrayList<>(APISearchModule.categoryBeans);
           SearchResultBean searchResultBean = new SearchResultBean();
           searchResultBean.setCode(LifeplusAPIBean.RETURN_SUCCESS);
           searchResultBean.setTagBeans(tags);
-          searchResultBean.setCategoryBeans(categoryBeans);
+          searchResultBean.setCategoryBeans(categories);
           searchResultBean.setData(list);
           searchResultBean.setListCount(list.size());
           return searchResultBean;
@@ -81,41 +85,40 @@ public class APISearchModule extends LifeplusAPIModule<SearchRequestBean, Search
       }
     }
 
-    return new LifeplusAPIRepository().search(requestBean).doOnSuccess(new Consumer<SearchResultBean>() {
-      @Override
-      public void accept(SearchResultBean searchResultBean) throws Exception {
+    return new LifeplusAPIRepository().search(requestBean)
+      .doOnSuccess(searchResultBean -> {
         // 기본 데이터(필터/정렬 없이 전체 데이터)라면 캐쉬에 저장
         // 필터/정렬이 없을 때만 적용
         if (StringUtil.isEmpty(filters) && StringUtil.isEmpty(categoryNo)) {
-          Log.e("APP# APISearchModule | getAPI", "|" + " ************** cache saving ***************");
+          Log.w("APP# APISearchModule | getAPI", "|" + " ************** cache saving ***************");
           // 필터 없는 데이터
           // 로드한 전체 데이터 저장
           keyword = requestBean.getKeyword();
           order = requestBean.getOrder();
-          searchContentsBeans = new ArrayList<>();
+
           if (null != searchResultBean.getData()) {
-            searchContentsBeans.addAll(searchResultBean.getData());
+            searchContentsReference = new SoftReference<>(new ArrayList<>(searchResultBean.getData()));
           }
-          tagBeans = new ArrayList<>();
+
           if (null != searchResultBean.getTagBeans()) {
-            tagBeans.addAll(searchResultBean.getTagBeans());
+            tagReference = new SoftReference<>(new ArrayList<>(searchResultBean.getTagBeans()));
           }
-          categoryBeans = new ArrayList<>();
+
           if (null != searchResultBean.getCategoryBeans()) {
-            categoryBeans.addAll(searchResultBean.getCategoryBeans());
+            categoryReference = new SoftReference<>(new ArrayList<>(searchResultBean.getCategoryBeans()));
           }
         }
-      }
-    });
+      });
   }
 
   /**
    * clear cache
    */
   public static void clearCache() {
-    searchContentsBeans = null;
-    tagBeans = null;
-    categoryBeans = null;
+    Log.w("APP# APISearchModule | getAPI", "|" + " ================ cache clear ================");
+    searchContentsReference = null;
+    tagReference = null;
+    categoryReference = null;
     keyword = null;
     order = null;
   }

+ 0 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/search/SearchModel.java

@@ -58,7 +58,6 @@ public class SearchModel extends Model {
 
   @Override
   protected void destroyInternal() {
-    APISearchModule.clearCache();
   }
 
   @Override

+ 0 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/search/SearchResultCategoryAdapter.java

@@ -5,7 +5,6 @@ package kr.co.zumo.app.lifeplus.view.screen.search;
 
 import android.support.annotation.NonNull;
 import android.support.v7.widget.RecyclerView;
-import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -47,7 +46,6 @@ public class SearchResultCategoryAdapter extends RecyclerView.Adapter<SearchResu
   public void onBindViewHolder(@NonNull SearchResultCategoryHolder holder, int position) {
 
     CategoryCheckBean bean = categoryCheckBeans.get(position);
-    Log.e("APP#  SearchResultCategoryAdapter | onBindViewHolder", "|" + bean.getCategoryNo());
     holder.bind(bean, listener);
   }
 

+ 1 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/search/SearchResultModel.java

@@ -97,6 +97,7 @@ public class SearchResultModel extends Model {
 
   @Override
   protected void destroyInternal() {
+    APISearchModule.clearCache();
     ContentsFlagHelper.getInstance().unregisterChangedObserver(hashCode);
   }