- 下面是一个为bitmap建立
[LruCache]( ) 的示例:
-
private LruCache mMemoryCache;
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
…
-
// Get memory class of this device, exceeding this amount will throw an
-
// OutOfMemory exception.
-
final int memClass = ((ActivityManager) context.getSystemService(
-
Context.ACTIVITY_SERVICE)).getMemoryClass();
-
// Use 1/8th of the available memory for this memory cache.
-
final int cacheSize = 1024 * 1024 * memClass / 8;
-
mMemoryCache = new LruCache(cacheSize) {
-
@Override
-
protected int sizeOf(String key, Bitmap bitmap) {
-
// The cache size will be measured in bytes rather than number of items.
-
return bitmap.getByteCount();
-
}
-
};
-
…
-
}
-
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
-
if (getBitmapFromMemCache(key) == null) {
-
mMemoryCache.put(key, bitmap);
-
}
-
}
-
public Bitmap getBitmapFromMemCache(String key) {
-
return mMemoryCache.get(key);
-
}
-
- Note: 在上面的例子中, 有1/8的程序内存被作为Cache. 在一个常见的设备上(hdpi),最小大概有4MB (32/8). 一个全屏的
[GridView]( )
组件,如果被800x480像素的图片填满大概会花费1.5MB (800*480*4 bytes), 因此这大概最少可以缓存2.5张图片到内存中.
- Note: 在上面的例子中, 有1/8的程序内存被作为Cache. 在一个常见的设备上(hdpi),最小大概有4MB (32/8). 一个全屏的
-
当加载位图到
[ImageView]( )
时,[LruCache]( )
会先被检查是否存在这张图片。如果找到有,它会被用来立即更新[ImageView]( )
组件,否则一个后台线程则被触发去处理这张图片。
-
public void loadBitmap(int resId, ImageView imageView) {
-
final String imageKey = String.valueOf(resId);
-
final Bitmap bitmap = getBitmapFromMemCache(imageKey);
-
if (bitmap != null) {
-
mImageView.setImageBitmap(bitmap);
-
} else {
-
mImageView.setImageResource(R.drawable.image_placeholder);
-
BitmapWorkerTask task = new BitmapWorkerTask(mImageView);
-
task.execute(resId);
-
}
-
}
上面的程序中 [BitmapWorkerTask]( )
也需要做添加到内存Cache中的动作:
-
class BitmapWorkerTask extends AsyncTask {
-
…
-
// Decode image in background.
-
@Override
-
protected Bitmap doInBackground(Integer… params) {
-
final Bitmap bitmap = decodeSampledBitmapFromResource(
-
getResources(), params[0], 100, 100));
-
addBitmapToMemoryCache(String.valueOf(params[0]), bitmap);
-
return bitmap;
-
}
-
…
-
}
-
内存缓存能够提高访问最近查看过的位图,但是你不能保证这个图片会在Cache中。像类似
[GridView]( )
等带有大量数据的组件很容易就填满内存Cache。你的程序可能会被类似Phone call等任务而中断,这样后台程序可能会被杀死,那么内存缓存就会被销毁。一旦用户恢复前面的状态,你的程序就又需要为每个图片重新处理。 -
磁盘缓存磁盘缓存可以用来保存那些已经处理好的位图,并且在那些图片在内存缓存中不可用时减少加载的次数。当然从磁盘读取图片会比从内存要慢,而且读取操作需要在后台线程中处理,因为磁盘读取操作是不可预期的。
-
Note: 如果图片被更频繁的访问到,也许使用
[ContentProvider]( )
会更加的合适,比如在Gallery程序中。 -
在下面的sample code中实现了一个基本的
DiskLruCache
。然而,Android 4.0 的源代码提供了一个更加robust并且推荐使用的DiskLruCache
方案。(libcore/luni/src/main/java/libcore/io/DiskLruCache.java
). 因为向后兼容,所以在前面发布的Android版本中也可以直接使用。 (quick search 提供了一个实现这个解决方案的示例)。
-
private DiskLruCache mDiskCache;
-
private static final int DISK_CACHE_SIZE = 1024 * 1024 * 10; // 10MB
-
private static final String DISK_CACHE_SUBDIR = “thumbnails”;
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
…
-
// Initialize memory cache
-
…
-
File cacheDir = getCacheDir(this, DISK_CACHE_SUBDIR);
-
mDiskCache = DiskLruCache.openCache(this, cacheDir, DISK_CACHE_SIZE);
-
…
-
}
-
class BitmapWorkerTask extends AsyncTask {
-
…
-
// Decode image in background.
-
@Override
-
protected Bitmap doInBackground(Integer… params) {
-
final String imageKey = String.valueOf(params[0]);
-
// Check disk cache in background thread
-
Bitmap bitmap = getBitmapFromDiskCache(imageKey);
-
if (bitmap == null) { // Not found in disk cache
-
// Process as normal
-
final Bitmap bitmap = decodeSampledBitmapFromResource(
-
getResources(), params[0], 100, 100));
-
}
-
// Add final bitmap to caches
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip204888 备注Android获取(资料价值较高,非无偿)
设计模式学习笔记
设计模式系列学习视频
,并且后续会持续更新**
如果你觉得这些内容对你有帮助,可以添加V:vip204888 备注Android获取(资料价值较高,非无偿)
[外链图片转存中…(img-VskzxbNv-1711598894826)]
设计模式学习笔记
[外链图片转存中…(img-jg7VL3sm-1711598894826)]
设计模式系列学习视频
[外链图片转存中…(img-eHM2lRms-1711598894827)]