package com.elphin.framework.app.fpstack; import android.support.v4.util.LruCache; import java.lang.ref.SoftReference; import java.util.LinkedHashMap; import com.baidu.map.components.platform.manager.ComponentManager; /** * 页面生成工厂类 * <p>生成并维护page的实例,page实例依据类名和tag标识</p> * * @version 1.0 * @author elphin * @date 13-6-4 下午11:14 */ class PageFactoryImpl implements PageFactory { private static final boolean DEBUG = false; private static final String TAG = "PageFactory"; private static class PageFactoryHolder{ static final PageFactory sInstance = new PageFactoryImpl(); } public static PageFactory getInstance() { return PageFactoryHolder.sInstance; } private LruCache<String,BasePage> mLruCache; private LinkedHashMap<String,SoftReference<BasePage>> mSoftCache; private static final int MAX_LRU_SIZE = 32; //the max number of BasePage private static final int MAX_SOFT_SIZE = 10; private PageFactoryImpl(){ mSoftCache = new LinkedHashMap<String, SoftReference<BasePage>>(MAX_SOFT_SIZE); mLruCache = new LruCache<String, BasePage>(MAX_LRU_SIZE) { @Override protected void entryRemoved(boolean evicted, String key, BasePage oldValue, BasePage newValue) { super.entryRemoved(evicted, key, oldValue, newValue); if (oldValue != null){ if(DEBUG){ android.util.Log.i(TAG,"LruCache entryRemoved size:"+this.size()); } mSoftCache.put(key, new SoftReference<BasePage>(oldValue)); } } @Override protected BasePage create(String key) { return super.create(key);// null //return newBasePageInstance(key); } }; } @Override public BasePage getBasePageInstance(String pageClsName) { return getBasePageInstance(pageClsName,DEFAULT_PAGE_TAG); } /** * <p>获取页面对象</p> * * 首先从LRUcache中查找,没有再从softcache中查找 * * @param pageClsName 页面类名 * @param pageTagString 页面标签,用于区分多实例 * @return 页面对象 */ @Override public BasePage getBasePageInstance(String pageClsName,String pageTagString) { if (pageClsName == null) { return null; //throw new NullPointerException("pageClsName == null"); } String pageCacheKey = pageTagString == null ? pageClsName +"@" +DEFAULT_PAGE_TAG : pageClsName+"@"+pageTagString; BasePage page; synchronized (mLruCache) { page = mLruCache.get(pageCacheKey); if(page != null){ mLruCache.remove(pageCacheKey); mLruCache.put(pageCacheKey,page); return page; } } synchronized (mSoftCache) { SoftReference<BasePage> softReference = mSoftCache.get(pageCacheKey); if(softReference!=null) { page = softReference.get(); if( page!=null) { mLruCache.put(pageCacheKey,page); mSoftCache.remove(pageCacheKey); return page; }else mSoftCache.remove(pageCacheKey); } } page = newBasePageInstance(pageClsName); synchronized (mLruCache) { mLruCache.put(pageCacheKey,page); } return page; } @Override public void clearCache() { mLruCache.evictAll(); mSoftCache.clear(); } @Override public void removePage(BasePage page) { String pageTag = page.getPageTag(); String pageCacheKey = pageTag == null ? page.getClass().getName() +"@" +DEFAULT_PAGE_TAG : page.getClass().getName()+"@"+pageTag; synchronized (mLruCache) { mLruCache.remove(pageCacheKey); } synchronized (mSoftCache) { mSoftCache.remove(pageCacheKey); } } /** * 获取新的页面实例 * @param pageClsName 页面类名 * @return */ private BasePage newBasePageInstance(String pageClsName) { Class<?> pgCls; BasePage page = null; try { // pgCls = Class.forName(pageClsName); pgCls = getPageClassByName(pageClsName); if(pgCls != null) { page = (BasePage)pgCls.newInstance(); } }catch ( ClassNotFoundException e ) { }catch ( IllegalAccessException e ) { }catch ( InstantiationException e ) { } return page; } private Class<?> getPageClassByName(String pageClsName) throws ClassNotFoundException { Class<?> pageClass = null; if (ComponentManager.getInstance().isComponentPage(pageClsName)) { pageClass = ComponentManager.getInstance().getComponentPageClass(pageClsName); if (pageClass != null) { return pageClass; } } pageClass = Class.forName(pageClsName); return pageClass; } }