/* * Copyright 2014 Jeremie Long * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.lithidsw.wallbox.loader; import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; import android.graphics.Bitmap; public class MemoryCache { private Map<String, Bitmap> cache = Collections .synchronizedMap(new LinkedHashMap<String, Bitmap>(10, 1.5f, true)); private long size = 0; private long limit = 100000; public MemoryCache() { setLimit(Runtime.getRuntime().maxMemory() / 4); } public void setLimit(long new_limit) { limit = new_limit; } public Bitmap get(String id) { try { if (!cache.containsKey(id)) { return null; } // NullPointerException sometimes happen here // http://code.google.com/p/osmdroid/issues/detail?id=78 return cache.get(id); } catch (NullPointerException ex) { ex.printStackTrace(); return null; } } public void put(String id, Bitmap bitmap) { try { if (cache.containsKey(id)) { size -= getSizeInBytes(cache.get(id)); } cache.put(id, bitmap); size += getSizeInBytes(bitmap); checkSize(); } catch (Throwable th) { th.printStackTrace(); } } private void checkSize() { if (size > limit) { Iterator<Entry<String, Bitmap>> iter = cache.entrySet().iterator(); while (iter.hasNext()) { Entry<String, Bitmap> entry = iter.next(); size -= getSizeInBytes(entry.getValue()); iter.remove(); if (size <= limit) break; } } } public void clear() { try { // NullPointerException sometimes happen here // http://code.google.com/p/osmdroid/issues/detail?id=78 cache.clear(); size = 0; } catch (NullPointerException ex) { ex.printStackTrace(); } } long getSizeInBytes(Bitmap bitmap) { if (bitmap == null) { return 0; } return bitmap.getRowBytes() * bitmap.getHeight(); } }