/*
* Created by LuaView.
* Copyright (c) 2017, Alibaba Group. All rights reserved.
*
* This source code is licensed under the MIT.
* For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
*/
package com.taobao.luaview.cache;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 所有LuaView级别的cache管理
*
* @author song
* @date 16/4/11
* 主要功能描述
* 修改描述
* 上午11:32 song XXX
*/
public class LuaCache {
//缓存的数据,需要在退出的时候清空
private Map<Class, List<WeakReference<CacheableObject>>> mCachedObjects;
//缓存数据管理器
public interface CacheableObject {
void onCacheClear();
}
/**
* clear cache
*/
public static void clear() {
SimpleCache.clear();
WeakCache.clear();
}
/**
* 缓存对象
*
* @param type
* @param obj
*/
public void cacheObject(Class type, CacheableObject obj) {
if (mCachedObjects == null) {
mCachedObjects = new HashMap<Class, List<WeakReference<CacheableObject>>>();
}
List<WeakReference<CacheableObject>> cache = mCachedObjects.get(type);
if (cache == null) {
cache = new ArrayList<WeakReference<CacheableObject>>();
mCachedObjects.put(type, cache);
}
if (!cache.contains(obj)) {
cache.add(new WeakReference<CacheableObject>(obj));
}
}
/**
* 清理所有缓存的对象
* TODO 需要在onShow的时候恢复所有cache后的对象
*/
public void clearCachedObjects() {
if (mCachedObjects != null && mCachedObjects.size() > 0) {
for (final Class type : mCachedObjects.keySet()) {
List<WeakReference<CacheableObject>> cache = mCachedObjects.get(type);
if (cache != null) {
for (int i = 0; i < cache.size(); i++) {
final WeakReference<CacheableObject> obj = cache.get(i);
if (obj != null && obj.get() != null) {
obj.get().onCacheClear();
}
cache.set(i, null);
}
}
mCachedObjects.put(type, null);
}
mCachedObjects.clear();
}
mCachedObjects = null;
}
}