写程序简单,但是写好的程序很难。这里谈一谈android性能方面的问题。
staticint intVal =42;staticString strVal ="Hello, world!";当第一次使用类中的static变量时,虚拟机会调用 <clinit> 方法去初始化类,并将 42 保存到 iniVal 变量中, 将 字符串内容保存到 字符串常量表中,并将引用赋值给 strVal。
staticfinalint intVal =42;staticfinalString strVal ="Hello, world!";当访问时,不需要初始化类,访问 intVal时,会直接使用 42, 访问 strVal 时, 会使用一个相对来说效率更高的字符串访问指令。都比static 变量访问快很多。
public enum ImageCache {
INSTANCE;
public static final String TAG = "ImageCache";
private static final float defaultCacheSizePercent = 1.0f / 10;
private LruCache<String, BitmapDrawable> mMemoryCache;
private int memCacheSize;
ImageCache() {
memCacheSize = Math.round(defaultCacheSizePercent
* Runtime.getRuntime().maxMemory() / 1024); //采用虚拟机最大内存的十分之一作为缓存大小。使用kb作为单位,这里的单位只要与sizeof方法返回的单位保持一致就行。
mMemoryCache = new LruCache<String, BitmapDrawable>(memCacheSize) {
@Override
protected int sizeOf(String key, BitmapDrawable value) {
return getBitmapSize(value); //获得图片大小。这个用作管理缓存大小的依据 。
}
};
}
/**
* Get the size in bytes of a bitmap in a BitmapDrawable.
*
* @param value
* @return size in bytes
*/
@TargetApi(12)
public static int getBitmapSize(BitmapDrawable value) {
int size = 0;
Bitmap bitmap = value.getBitmap();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1) {
size = bitmap.getByteCount();
}
// Pre HC-MR1
size = bitmap.getRowBytes() * bitmap.getHeight();
return size == 0 ? 1 : size / 1024;
}
/**
* Adds a bitmap to both memory and disk cache.
*
* @param data
* Unique identifier for the bitmap to store
* @param value
* The bitmap drawable to store
*/
public void addBitmapToCache(String data, BitmapDrawable value) {
if (data == null || value == null) {
return;
}
// Add to memory cache
if (mMemoryCache != null) {
mMemoryCache.put(data, value);
}
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.i(TAG, "add to Memory cache :" + data);
}
}
/**
* Get from memory cache.
*
* @param data
* Unique identifier for which item to get
* @return The bitmap drawable if found in cache, null otherwise
*/
public BitmapDrawable getBitmapFromMemCache(String data) {
BitmapDrawable memValue = null;
if (mMemoryCache != null) {
memValue = mMemoryCache.get(data);
}
if(Log.isLoggable(TAG, Log.INFO)){
Log.i(TAG, mMemoryCache.toString());
}
return memValue;
}
}
参考: