缓存Bitmap

Bitmap三级缓存+二次采样 Bitmap三级缓存 一.为什么使用Bitmap三级缓存? 1.没有缓存的弊端:费流量,加载速度慢 2.加入缓存的优点:省流量,支持离线浏览 二.原理 思路: 1.从内存获取图片,如果存在,则显示;如果不存在,则从SD卡中获取图片 2.从SD卡中获取图片,如果文件中存在,显示,并且添加到内存中,否则开启网络下载图片 三.代码 (1).添加读写SD卡的权限和网络权限 <uses-permis... 阅读详情

加载一个Bitmap(位图)到你的UI界面是非常简单的,但是如果你要一次加载一大批,事情就变得复杂多了。在大多数的情况下(如ListView、GridView或者ViewPager这样的组件),屏幕上的图片以及马上要在滚动到屏幕上显示的图片的总量,在本质上是不受限制的。

        像这样的组件在子视图移出屏幕后会进行视图回收,内存使用仍被保留。但假设你不保留任何长期存活的引用,垃圾回收器也会释放你所加载的Bitmap。这自然再好不过了,但是为了保持流畅且快速加载的UI,你要避免继续在图片回到屏幕上的时候重新处理。使用内存和硬盘缓存通常能解决这个问题,使用缓存允许组件快速加载并处理图片。

        这节课将带你使用内存和硬盘缓存Bitmap,以在加载多个Bitmap的时候提升UI的响应性和流畅性。

使用内存缓存

        以牺牲宝贵的应用内存为代价,内存缓存提供了快速的Bitmap访问方式。LruCache类(可以在Support Library中获取并支持到API  Level 4以上,即1.6版本以上)是非常适合用作缓存Bitmap任务的,它将最近被引用到的对象存储在一个强引用的LinkedHashMap中,并且在缓存超过了指定大小之后将最近不常使用的对象释放掉。

        注意:以前有一个非常流行的内存缓存实现是SoftReference(软引用)或者WeakReference(弱引用)的Bitmap缓存方案,然而现在已经不推荐使用了。自Android2.3版本(API Level 9)开始,垃圾回收器更着重于对软/弱引用的回收,这使得上述的方案相当无效。此外,Android 3.0(API Level 11)之前的版本中,Bitmap的备份数据直接存储在本地内存中并以一种不可预测的方式从内存中释放,很可能短暂性的引起程序超出内存限制而崩溃。

        为了给LruCache选择一个合适的大小,要考虑到很多原因,例如:

  • 其他的Activity(活动)和(或)程序都是很耗费内存的吗?
  • 屏幕上一次会显示多少图片?有多少图片将在屏幕上显示?
  • 设备的屏幕大小和密度是多少?一个超高清屏幕(xhdpi)的设备如Galaxy Nexus,相比Nexus S(hdpi)来说,缓存同样数量的图片需要更大的缓存空间。
  • Bitmap的尺寸、配置以及每张图片需要占用多少内存?
  • 图片的访问是否频繁?有些会比其他的更加被频繁的访问到吗?如果是这样,也许你需要将某些图片一直保留在内存中,甚至需要多个LruCache对象分配给不同组的Bitmap。
  • 你能平衡图片的质量和数量么?有的时候存储大量低质量的图片更加有用,然后可以在后台任务中加载另一个高质量版本的图片。

        对于设置缓存大小,并没有适用于所有应用的规范,它取决于你在内存使用分析后给出的合适的解决方案。缓存空间太小并无益处,反而会引起额外的开销,而太大了又可能再次引起java.lang.OutOfMemory异常或只留下很小的空间给应用的其他程序运行。   

        这里有一个设置Bitmap的LruCache示例:

01 private LruCache<String, Bitmap> mMemoryCache;
02  
03 @Override
04 protected void onCreate(Bundle savedInstanceState) {
05     ...
06     // Get memory class of this device, exceeding this amount will throw an
07     // OutOfMemory exception.
08     final int memClass = ((ActivityManager) context.getSystemService(
09             Context.ACTIVITY_SERVICE)).getMemoryClass();
10  
11     // Use 1/8th of the available memory for this memory cache.
12     final int cacheSize = 1024 * 1024 * memClass / 8;
13  
14     mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
15         @Override
16         protected int sizeOf(String key, Bitmap bitmap) {
17             // The cache size will be measured in bytes rather than number of items.
18             return bitmap.getByteCount();
19         }
20     };
21     ...
22 }
23  
24 public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
25     if (getBitmapFromMemCache(key) == null) {
26         mMemoryCache.put(key, bitmap);
27     }
28 }
29  
30 public Bitmap getBitmapFromMemCache(String key) {
31     return mMemoryCache.get(key);
32 }

        注意:在这个例子中,1/8的应用内存被分配给缓存。在一个普通的/hdpi设备上最低也在4M左右(32/8)。一个分辨率为800*480的设备上,全屏的填满图片的GridView占用的内存约1.5M(800*480*4字节),因此这个大小的内存可以缓存2.5页左右的图片。

        当加载一个Bitmap到ImageView中,先要检查LruCache。如果有相应的数据,则立即用来更新ImageView,否则将启动后台线程来处理这个图片。

01 public void loadBitmap(int resId, ImageView imageView) {
02     final String imageKey = String.valueOf(resId);
03  
04     final Bitmap bitmap = getBitmapFromMemCache(imageKey);
05     if (bitmap != null) {
06         mImageView.setImageBitmap(bitmap);
07     } else {
08         mImageView.setImageResource(R.drawable.image_placeholder);
09         BitmapWorkerTask task = new BitmapWorkerTask(mImageView);
10         task.execute(resId);
11     }
12 }

        BitmapWorkerTask也需要更新内存中的数据:

01 class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
02     ...
03     // Decode image in background.
04     @Override
05     protected Bitmap doInBackground(Integer... params) {
06         final Bitmap bitmap = decodeSampledBitmapFromResource(
07                 getResources(), params[0], 100, 100));
08         addBitmapToMemoryCache(String.valueOf(params[0]), bitmap);
09         return bitmap;
10     }
11     ...
12 }

使用硬盘缓存

        一个内存缓存对加速访问最近浏览过的Bitmap非常有帮助,但是你不能局限于内存中的可用图片。GridView这样有着更大的数据集的组件可以很轻易消耗掉内存缓存。你的应用有可能在执行其他任务(如打电话)的时候被打断,并且在后台的任务有可能被杀死或者缓存被释放。一旦用户重新聚焦(resume)到你的应用,你得再次处理每一张图片。

        在这种情况下,硬盘缓存可以用来存储Bitmap并在图片被内存缓存释放后减小图片加载的时间(次数)。当然,从硬盘加载图片比内存要慢,并且应该在后台线程进行,因为硬盘读取的时间是不可预知的。

        注意:如果访问图片的次数非常频繁,那么ContentProvider可能更适合用来存储缓存图片,例如Image Gallery这样的应用程序。

        这个类中的示例代码使用DiskLruCache(来自Android源码)实现。在示例代码中,除了已有的内存缓存,还添加了硬盘缓存。

01 private DiskLruCache mDiskLruCache;
02 private final Object mDiskCacheLock = new Object();
03 private boolean mDiskCacheStarting = true;
04 private static final int DISK_CACHE_SIZE = 1024 * 1024 * 10; // 10MB
05 private static final String DISK_CACHE_SUBDIR = "thumbnails";
06  
07 @Override
08 protected void onCreate(Bundle savedInstanceState) {
09     ...
10     // Initialize memory cache
11     ...
12     // Initialize disk cache on background thread
13     File cacheDir = getDiskCacheDir(this, DISK_CACHE_SUBDIR);
14     new InitDiskCacheTask().execute(cacheDir);
15     ...
16 }
17  
18 class InitDiskCacheTask extends AsyncTask<File, Void, Void> {
19     @Override
20     protected Void doInBackground(File... params) {
21         synchronized (mDiskCacheLock) {
22             File cacheDir = params[0];
23             mDiskLruCache = DiskLruCache.open(cacheDir, DISK_CACHE_SIZE);
24             mDiskCacheStarting = false; // Finished initialization
25             mDiskCacheLock.notifyAll(); // Wake any waiting threads
26         }
27         return null;
28     }
29 }
30  
31 class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
32     ...
33     // Decode image in background.
34     @Override
35     protected Bitmap doInBackground(Integer... params) {
36         final String imageKey = String.valueOf(params[0]);
37  
38         // Check disk cache in background thread
39         Bitmap bitmap = getBitmapFromDiskCache(imageKey);
40  
41         if (bitmap == null) { // Not found in disk cache
42             // Process as normal
43             final Bitmap bitmap = decodeSampledBitmapFromResource(
44                     getResources(), params[0], 100, 100));
45         }
46  
47         // Add final bitmap to caches
48         addBitmapToCache(imageKey, bitmap);
49  
50         return bitmap;
51     }
52     ...
53 }
54  
55 public void addBitmapToCache(String key, Bitmap bitmap) {
56     // Add to memory cache as before
57     if (getBitmapFromMemCache(key) == null) {
58         mMemoryCache.put(key, bitmap);
59     }
60  
61     // Also add to disk cache
62     synchronized (mDiskCacheLock) {
63         if (mDiskLruCache != null && mDiskLruCache.get(key) == null) {
64             mDiskLruCache.put(key, bitmap);
65         }
66     }
67 }
68  
69 public Bitmap getBitmapFromDiskCache(String key) {
70     synchronized (mDiskCacheLock) {
71         // Wait while disk cache is started from background thread
72         while (mDiskCacheStarting) {
73             try {
74                 mDiskCacheLock.wait();
75             } catch (InterruptedException e) {}
76         }
77         if (mDiskLruCache != null) {
78             return mDiskLruCache.get(key);
79         }
80     }
81     return null;
82 }
83  
84 // Creates a unique subdirectory of the designated app cache directory. Tries to use external
85 // but if not mounted, falls back on internal storage.
86 public static File getDiskCacheDir(Context context, String uniqueName) {
87     // Check if media is mounted or storage is built-in, if so, try and use external cache dir
88     // otherwise use internal cache dir
89     final String cachePath =
90             Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ||
91                     !isExternalStorageRemovable() ? getExternalCacheDir(context).getPath() :
92                             context.getCacheDir().getPath();
93  
94     return new File(cachePath + File.separator + uniqueName);
95 }

        注意:即便是硬盘缓存初始化也需要硬盘操作,因此不应该在主线程执行。但是,这意味着硬盘缓存在初始化前就能被访问到。为了解决这个问题,在上面的实现中添加了一个锁对象(lock object),以确保在缓存被初始化之前应用无法访问硬盘缓存。

        在UI线程中检查内存缓存,相应的硬盘缓存检查应在后台线程中进行。硬盘操作永远不要在UI线程中发生。当图片处理完成后,最终的Bitmap要被添加到内存缓存和硬盘缓存中,以便后续的使用。

 处理配置更改

        运行时的配置会发生变化,例如屏幕方向的改变,会导致Android销毁并以新的配置重新启动Activity(关于此问题的更多信息,请参阅Handling Runtime Changes)。为了让用户有着流畅而快速的体验,你需要在配置发生改变的时候避免再次处理所有的图片。

        幸运的是,你在“使用内存缓存”一节中为Bitmap构造了很好的内存缓存。这些内存可以通过使用Fragment传递到信的Activity(活动)实例,这个Fragment可以调用setRetainInstance(true)方法保留下来。在Activity(活动)被重新创建后,你可以在上面的Fragment中访问到已经存在的缓存对象,使得图片能快加载并重新填充到ImageView对象中。

        下面是一个使用Fragment将LruCache对象保留在配置更改中的示例:

01 private LruCache<String, Bitmap> mMemoryCache;
02  
03 @Override
04 protected void onCreate(Bundle savedInstanceState) {
05     ...
06     RetainFragment mRetainFragment =
07             RetainFragment.findOrCreateRetainFragment(getFragmentManager());
08     mMemoryCache = RetainFragment.mRetainedCache;
09     if (mMemoryCache == null) {
10         mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
11             ... // Initialize cache here as usual
12         }
13         mRetainFragment.mRetainedCache = mMemoryCache;
14     }
15     ...
16 }
17  
18 class RetainFragment extends Fragment {
19     private static final String TAG = "RetainFragment";
20     public LruCache<String, Bitmap> mRetainedCache;
21  
22     public RetainFragment() {}
23  
24     public static RetainFragment findOrCreateRetainFragment(FragmentManager fm) {
25         RetainFragment fragment = (RetainFragment) fm.findFragmentByTag(TAG);
26         if (fragment == null) {
27             fragment = new RetainFragment();
28         }
29         return fragment;
30     }
31  
32     @Override
33     public void onCreate(Bundle savedInstanceState) {
34         super.onCreate(savedInstanceState);
35         setRetainInstance(true);
36     }
37 }

        为了测试这个,可以在不适用Fragment的情况下旋转设备屏幕。在保留缓存的情况下,你应该能发现填充图片到Activity中几乎是瞬间从内存中取出而没有任何延迟的感觉。任何图片优先从内存缓存获取,没有的话再到硬盘缓存中找,如果都没有,那就以普通方式加载图片。

转至:http://my.oschina.net/ryanhoo/blog/88443


ShortUrl 短网址生成工具 支持新浪 腾讯 百度.zip 短链接生成 立即下载

相关推荐

simple-java-bitly:Java的非常简单的URL缩短器

Bit.ly的简单Java客户端 使用Bit.ly API的Java非常简单的URL缩短和扩展器。 先决条件 您需要在bitly.com上拥有一个帐户。 否则,您可以创建一个帐户。 然后,您需要在生成访问令牌。 您将需要此令牌才能使用此库。 使用Maven安装 pom.xml < dependency> < groupId>com.github.romain-warnan</ groupId> < artifactId>simple-java-bitly</ artifactId> < version>1.1</ version> </ dependency> 用法

【Google官方教程】第三课:缓存Bitmap

转载声明:Ryan的博客文章欢迎您的转载,但在转载的同时,请注明文章的来源出处,不胜感激! :-) http://my.oschina.net/ryanhoo/blog/88443 译者:Ryan Hoo 来源:https://developer.android.com...

cibaoqb025084的博客 327

bitly_api:对Bitly API传递给它的数据进行一些计算的API

bitly_api:对Bitly API传递给它的数据进行一些计算的API

百度得到的有用的解决方法/收藏一些有用的博文链接

1.Windows 下 VSCode 使用 SSH 连接报 Bad owner or permissions on C:\\Users\\Administrator/.ssh/config 错误问题解决: 解决:https://blog.youkuaiyun.com/chaoenhu/article/details/103698804

bitttttttttttfly的博客 8615

Bitly

Bitly 0 读取文本文件(JSON格式) 读取文件中第一行 path = 'pydata-book/datasets/bitly_usagov/example.txt' open(path).readline() # 文件第一行 上下文管理器with with open(path) as file: print(file.readline()) print(file.readline()) import json path = 'pydata-book/datasets/bitly_usagov/example.txt' records = [json.loads(

Bitly「BitLy」-crx插件

缩短链接快速和容易 *右键单击链接以缩短“href”属性的内容 *右键单击所选文本将其视为链接并将其缩短 *要缩短位于地址栏右侧的当前标签网址点击扩展程序的按钮 短网址将被自动复制到剪贴板。 支持语言:English

Bitmap高效缓存

本文主要是对慕课网qndroid老师视频教程的总结,视频链接 Bitmap基本概念 Bitmap并不是只属于Android的概念;Bitmap(又称栅格图、点阵图)是使用像素阵列来表示的图像。 对于android而言: 1.Bitmap是Android系统中的图像处理的最重要类之一。 2.通过Bitmap我们可以获取图片的信息。 比如图片宽、高、Alpha值,也可以根据这个Bitmpa再创建新的B...

麦田 362

在Docker中集成GPU监控体系

先上效果图 等文档整理出来再更

tamako0v0的博客 2471

Android Bitmap 缓存

将单个Bitmap加载到UI是简单直接的,但是如果我们需要一次性加载大量的图片,事情则会变得复杂起来。在大多数情况下(例如在使用ListView,GridView或ViewPager时),屏幕上的图片和因滑动将要显示的图片的数量通常是没有限制的。通过循环利用子视图可以缓解内存的使用,垃圾回收器也会释放那些不再需要使用的Bitmap。这些机制都非常好,但是为了保证一个流畅的用户体验,我们希望避免在每次

chengzhao00885的博客 341

深度学习12—VGG19实现

state_dict = load_state_dict_from_url(model_urls['vgg19'],model_dir='./model' ,progress=progress)#预训练模型地址。accuracy=((out.argmax(1)==label).sum()).clone().detach().cpu().numpy()#正确预测的总和比测试集的长度,即预测正确的精度。image=torch.reshape(image,(1,3,224,224))#四维图形,RGB三个通。

m0_55196097的博客 2444

从零部署奥比中光Gemini335L:Python SDK编译与手眼标定环境实战

本文提供了一份从零部署奥比中光Gemini 335L深度相机的完整实战指南。详细介绍了驱动安装、Python SDK编译、CMake配置及虚拟环境搭建等关键步骤,并重点解析了如何通过编译生成Python模块,最终实现深度图与点云数据获取,为后续的机械臂手眼标定工作奠定坚实基础。

weixin_29031161的博客 399

Bitmap三级缓存 和二次采样

一.为什么Bitmap三级缓存? 没有缓存的弊端 :费流量, 加载速度慢 加入缓存的优点: 省流量,支持离线浏览 二.原理 从内存获取图片, 如果存在, 则显示; 如果不存在, 则从SD卡中获取图片 从SD卡中获取图片, 如果文件中存在, 显示, 并且添加到内存中; 否则开启网络下载图片 从网络下载图片, 如果下载成功, 则添加到缓存中, 存入SD卡, 显示图片 三.代码 (1)添加读写SD卡的...

chen1459的博客 1792

【matlab】MATLAB 变量详解与应用

在 MATLAB 中,变量可以通过赋值操作进行定义。例如,要定义一个名为xx = 10;在这个例子中,我们创建了一个名为x的变量,并将其赋值为 10。需要注意的是,MATLAB 是一种动态类型语言,因此不需要显式地声明变量的类型。变量名必须以字母开头。变量名可以包含字母、数字和下划线。变量名区分大小写。不要使用 MATLAB 中的关键字(如forif等)作为变量名。

小吴同学的博客 2213

Bitmap使用中的两级缓存,及内存重用

案例是测试Bitmap使用过程中,如何使用二级缓存,及重用bitmap的内存 这里的二级缓存,一是内存缓存,而是磁盘缓存。 代码中已加注释,所以可以直接看代码: 一,首先是主Activity,其中会设置recyclerView的布局类型,适配器,设置磁盘缓存的路径。 public class MainActivity extends AppCompatActivity { pri...

lin20080410的专栏 771

基于Simulink的电源纹波抑制仿真

电源纹波(Power Supply Ripple)是指直流电源输出中存在的交流分量。纹波的存在会导致电压波动,进而影响负载设备的性能和寿命。为了确保高质量的电源输出,通常需要设计有效的滤波电路来抑制纹波。Simulink 提供了一个强大的仿真环境,可以用来设计、分析和验证电源纹波抑制方案。本教程将详细介绍如何使用 Simulink 进行电源纹波抑制的仿真实例。通过本教程,我们详细介绍了如何使用 Simulink 进行电源纹波抑制的仿真实例。背景介绍:理解电源纹波及其对电力电子系统的影响。仿真建模过程。

xiaoheshang_123的博客 514

在 SAP 系统中,成本中心(Cost Center)是成本核算与费用管控的基础组织单元,其设计质量直接决定了后续成本归集、分摊、分析及责任考核的准确性

SAP系统成本中心设计核心要点:1. 设计原则包括责任可控、业务同质、核算颗粒度适配、组织对齐及稳定性平衡;2. 划分维度主要有部门、功能、地域、项目和资产5类,可组合使用;3. 需避免颗粒度过细、跨责任主体归集等常见误区;4. 建议采用"明确目标-梳理业务-设计编码"三步法,建立科学的成本中心体系。合理的成本中心设计能精准归集费用、明确责任主体,为成本分析和管控奠定基础。

金牌架构师 1439

Bitmap recycle方法与制作Bitmap的内存缓存

recycle方法不是必须调用,就算调了GC也不会立即回收Java层的Bitmap对象。这个跟把一个对象手动置空一个道理。可以看一下API说明: This operation cannot be reversed, so it should only be called if you are sure there are no further uses for the bitmap. This

农场老马的专栏 9495

使用Simulink进行基于IIR滤波器的设计与稳定性分析仿真

IIR滤波器的稳定性与其系统函数的极点位置密切相关。如果所有极点都位于Z平面的单位圆内,则该滤波器是稳定的;否则,滤波器将是不稳定的。在设计IIR滤波器时,确保其稳定性对于避免输出信号发散至关重要。明确你的系统需求,比如输入信号类型(如正弦波)、采样率、IIR滤波器的设计参数(如滤波器类型、阶数、截止频率等)。假设我们需要设计一个低通IIR滤波器,用来去除高于500Hz的所有频率成分,保留低于500Hz的信号成分。采样率为8kHz。

xiaoheshang_123的博客 150

两种缓存Bitmap的方式

if (bitmap!= null) {} else {@OverrideUse a Disk Cache [使用磁盘缓存]内存缓存能够提高访问最近查看过的位图,但是你不能保证这个图片会在Cache中。像类似等带有大量数据的组件很容易就填满内存Cache。你的程序可能会被类似Phone call等任务而中断,这样后台程序可能会被杀死,那么内存缓存就会被销毁。一旦用户恢复前面的状态,你的程序就又需要为每个图片重新处理。

2401_84122760的博客 923

RK3568平台(camera篇) mipi csi接口

MIPI联盟,即移动产业处理器接口(Mobile Industry Processor Interface 简称MIPI)联盟。MIPI(移动产业处理器接口)是MIPI联盟发起的为移动应用处理器制定的开放标准和一个规范。MIPI是差分串口传输,速度快,抗干扰。主流手机模组现在都是用MIPI传输,传输时使用4对差分信号传输图像数据和一对差分时钟信号;MIPI摄像头有三个电源:VDDIO(IO电源),AVDD(模拟电源),DVDD(内核数字电源),不同sensor模组的摄像头供电不同。

weixin_49303682的博客 5348

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Bitmap的加载与缓存

1.前言 Bitmap的使用一共有两个需要注意的地方,一个是加载,一个是缓存。缓存的策略一般有两种,LruCache与DiskLruCache。 2.Bitmap的加载方式 (1).Bitmap提供了四种加载图片的方式 BitmapFactory.decodeResource();//从资源中加载 BitmapFactory.decodeFile();//从文件中加载 ...

赵小样Jasmine的博客 389

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Bitmap的加载跟缓存

首先来讲述如何有效的加载一个Bitmap,由于Bitmap的特殊性以及Android对单个应用所施加的内存限制,比如说16MB,这导致加载Bitmap的时候很容易出现内存溢出。 1.Bitmap在Android中指的是一张图片,可以是png格式也可以是jpg等其他常见的图片格式。BitmapFactory类提供了四类方法:decodeFile、decodeResource、decodeStrea

gzdxjj的专栏 336

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android平台Bitmap缓存为文件

如何将gif等图片格式在解析过程中解码得到的Bitmap转存为图片呢?Bitmap.java中提供了compress的方法,可以将Bitmap转换成文件,与BitmapFactory.java中的decodeStream方法相对应。下面是这两个方法的函数原型: public static Bitmap decodeStream(InputStream is); public boolean co

格物致知的专栏 1952

Redis 的 bitmap 来防止空值缓存

使用 Redis 的 bitmap 来防止空值缓存的方案:

weixin_46233936的博客 849
上一篇: 在UI中显示Bitmap
下一篇: Android如何防止apk程序被反编译
SpeedyCoder
博客等级 码龄14年 415粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值