Android之Bitmap高效缓存以及android缓存策略

Android之Bitmap高效缓存

一、Bitmap高效加载

1、bitmap的基本概念

位图:获取像素值进行加载。

Bitmap是Android系统中图像处理中的最重要的一个类。

通过Bitmap我们也看获取图片的信息

获取到信息后,我们可以对其进行缩放、裁剪等操作
2、Bitmap的加载方式

Bitmap有一些几种加载方式:

	BitmapFactory.decodeResource(); 	资源ID
	BitmapFactory.decodeStream();		流(网络)
	BitmapFactory.decodeByteArray();	字节数组
	BitmapFactory.decodeFile();		文件路径

3、如何高效加载Bitmap

防止内存溢出
尽可能的节省内存的开销
使我们的应用运行更加流畅

	BitmapFactory.Options为我们高效加载提供看可能。
	injustDecodeBounds 值获取宽和高
	outWidth&outHeight
	insmallSize 采样率
工具类
package com.example.jash.bitmap;import android.graphics.Bitmap;
import android.graphics.BitmapFactory;/**
 * Created by jash on 2017/12/24.
 */
public class BitmapUtils {/**
     * 压缩方法
     *
     * @param filepath 文件路径
     * @param pixelw   真正显示的宽度
     * @param piexlh   真正显示高度
     * @return
     */
    public static Bitmap ratio(String filepath, int pixelw, int piexlh) {BitmapFactory.Options options = new BitmapFactory.Options();
//        只加载图片的宽和高,不加载图片深圳的内容
        options.inJustDecodeBounds = true;
//        位深度,566 低  内存占用小
        options.inPreferredConfig = Bitmap.Config.RGB_565;
//      预加载  之后可以获取宽和高
        BitmapFactory.decodeFile(filepath, options);
//        获取原始的宽和高
        int originalw = options.outWidth;int originalh = options.outHeight;
//        采样
        options.inSampleSize = getSimpleSize(originalw, originalh, pixelw, piexlh);
//        真正加载
        options.inJustDecodeBounds = false;return BitmapFactory.decodeFile(filepath, options);}private static int getSimpleSize(int originalw, int originalh, int pixelw, int piexlh) {int simpleSize = 1;if (originalw > originalh && originalw > pixelw) {simpleSize = originalw / pixelw;} else if (originalh > originalw && originalh > piexlh) {simpleSize = originalh / piexlh;}if (simpleSize <= 0) {simpleSize = 1;}return simpleSize;}
}
缓存的概念:
缓存就是将从服务器获取到的json或者file等保存到本地,
缓存的优势:对一下不经常发生变化的数据,直接使用本地缓存,提升响应速度
	    不在频繁的请求服务器,减少服务器的负载
	     离线阅读等
使用场景:对Bitmap或者是file大数据进行缓存,无需每次都重新下载,尤其是ListView
	  数据不需要适时的更新,离线
 
缓存策略:	LruCache内存缓存
		DIskLruCache硬盘缓存
		Sql实现缓存(持久  不建议)
LruCache缓存
1、Lru是计算机科学经常使用的一种《近期最少使用的算法》
2、内部采用的是LinkedHashMap
注意问题:
1、内存缓存使用的是我们宝贵的内存资源,需要系统动态的调整内存的大小
2、注意版本适配,建议使用sopportv4包中的LruCache
方法:
package com.example.jash.bitmap;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.LruCache;
import android.widget.ImageView;import java.io.IOException;import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;/**
 * Created by jash on 2017/12/24.
 * 用于加载网络图片,并缓存到本地或者内存中
 */
public class SimpleImageLoader {private static SimpleImageLoader mloader;private LruCache<String, Bitmap> mLrucache;public static SimpleImageLoader getInstance() {if (mloader == null) {synchronized (SimpleImageLoader.class) {if (mloader == null) {mloader = new SimpleImageLoader();}}}return mloader;}//    用来初始化缓存对象
    private SimpleImageLoader() {int maxSize = (int) Runtime.getRuntime().maxMemory() / 8;mLrucache = new LruCache<String, Bitmap>(maxSize) {@Override
            protected int sizeOf(String key, Bitmap value) {return value.getByteCount();}};}/**
     * 用于加载网络图片
     * @param view
     * @param url
     */
    public void displayImage(ImageView view, String url) {Bitmap bitmap = getBitmapFromcache(url);if (bitmap != null) {view.setImageBitmap(bitmap);} else {downLoadImage(view, url);}}/**
     * 从缓存中读取图片
     *
     * @param url
     * @return
     */
    private Bitmap getBitmapFromcache(String url) {return mLrucache.get(url);}/**
     * 将下载下来的图片保存到缓存中
     *
     * @param bitmap
     * @param url
     */
    private void putBitmapToCache(Bitmap bitmap, String url) {if (bitmap != null) {mLrucache.put(url, bitmap);}}private void downLoadImage(final ImageView imageView, final String url) {OkHttpClient client = new OkHttpClient();final Request request = new Request.Builder().get().url(url).build();client.newCall(request).enqueue(new Callback() {@Override
            public void onFailure(Call call, IOException e) {}@Override
            public void onResponse(Call call, Response response) throws IOException {byte[] bytes = response.body().bytes();Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);putBitmapToCache(bitmap, url);}});}
}
main类中
package com.example.jash.bitmap;import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;import com.squareup.picasso.Picasso;public class MainActivity extends AppCompatActivity {private ImageView image;private final String IMAGE_URL = "http://img1.qq.com/ent/20050913/2312751.jpg";@Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);image = (ImageView) findViewById(R.id.down_image);}public void dowm(View view) {SimpleImageLoader loader = SimpleImageLoader.getInstance();loader.displayImage(image, IMAGE_URL);}
}
DiskLruCache硬盘缓存:
第三方开源库:
	1、通过DiskLruCache.open去初始化一个缓存对象
	2、通过DiskLruCache.get(String key)去获取到本地key下的缓存文件
	3、通过DiskLruCache.Editor对象将数据保存到本地
注意问题:
	1、根据外部存储设置合适的缓存路径;
		有外置/sdcard/Android/data/包名/cache
		无外置/data/data/Android/data/包名/cache
	2、缓存文件对key的命名有特殊要求
待完善!………………















本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2016蓝桥杯省赛---java---A---6(寒假作业)

题目描述 现在小学的数学题目也不是那么好玩的。 看看这个寒假作业&#xff1a;□ □ □ □ - □ □ □ □ □ □ □ □(如果显示不出来&#xff0c;可以参见【图1.jpg】)每个方块代表1~13中的某一个数字&#xff0c;但不能重复。 比如&#xff1a; 6 7 13 9 - 8 1 …

微服务网关Ocelot

微服务网关是微服务架构中的核心组件,它是客户端请求的门户,它是调用具体服务端的桥梁.下面我们将使用开源项目Ocelot&#xff08;https://github.com/geffzhang/Ocelot&#xff09;搭建一款轻量级服务网关,不过在此之前我们将对微服务网关做个详细介绍,以便大家更加清晰的了解…

定位网页元素

定位网页元素一、position属性&#xff1a; 1.static&#xff1a;默认值&#xff0c;网页没有定位 2.relative:相对定位 &#xff08;1&#xff09;设置相对定位的元素&#xff0c;盒子会相对于他原来的位置进行偏移&#xff0c;达到新位置。 &#xff08;2&#xff09;设置相对…

分表分库时机选择及策略

转载自 分表分库时机选择及策略 一. 分表 应用场景&#xff1a; 对于大型的互联网应用来说&#xff0c;数据库单表的记录行数可能达到千万级甚至是亿级&#xff0c;并且数据库面临着极高的并发访问。采用Master-Slave复制模式的MySQL架构&#xff0c;只能够对数据库的读进…

html session 登录页面跳转页面跳转页面,session失效后跳转到登陆页面

一、编写Filter拦截器类package com.pv.utils;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public …

pagerAdapter 与FragmentPagerAdapter的区别

转自&#xff1a;http://blog.csdn.net/dreamzml/article/details/9951577 ViewPager ViewPager 如其名所述&#xff0c;是负责翻页的一个 View。准确说是一个 ViewGroup&#xff0c;包含多个 View 页&#xff0c;在手指横向滑动屏幕时&#xff0c;其负责对 View 进行切换。为了…

2015蓝桥杯省赛---java---A---2(星系炸弹)

题目描述 思路分析 方案一 方案二 package TEST;import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date;class Main{public static void main(String[] args) {SimpleDateFormat dateFormat new SimpleDateFormat("yyyy-MM-dd");…

NuGet社区使用体验调查

Nuget 是我们使用.NET Core的一项基础设施&#xff0c;针对国内访问NuGet服务器速度不稳定的问题我们希望通过收集一些来自用户的反馈来改善社区使用NuGet的体验。恳请您花2-3分钟时间完成以下的问题&#xff0c;我们会非常重视您的反馈。当我们收集完成所有的问卷&#xff0c;…

在护卫神上部署javaWeb项目,已经测试通过

以前一直在护卫神上部署PHP项目&#xff0c;今天忽然来了需求是部署javaWeb项目&#xff0c;刚开始一脸蒙蔽&#xff0c;后来发现也不是很难。那么接下来我们看看怎么在护卫神上部署java项目&#xff1a; 第一步&#xff1a;打开护卫神&#xff0c;在护卫神中添加一个网站&…

为什么选择微服务架构?如何取舍?

转载自 为什么选择微服务架构&#xff1f;如何取舍&#xff1f; 微服务是什么 微服务是一种架构风格&#xff0c;一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署&#xff0c;各个微服务之间是松耦合的。每个微服务仅关注于完成…

三星系统和鸿蒙系统,又一设备直升鸿蒙系统,现有操作系统被抛弃,和三星的想法一样!...

又一设备直升鸿蒙系统&#xff0c;现有操作系统被抛弃&#xff0c;和三星的想法一样&#xff01;前段时间华为正式发布了鸿蒙系统&#xff0c;这个系统可以说是期待已久了&#xff0c;在华为处于禁令时期时&#xff0c;鸿蒙被认为是替代安卓的操作系统。在鸿蒙发布后&#xff0…

android之视频直播与播放Vitamio

直播APP l 直播原理 直播本质&#xff1a;实时推送/拉取过来的音视频数据 直播相关的协议&#xff1a; l RTMP&#xff08;实时消息的传输协议&#xff09; RTMP协议是一个互联网TCP/IP五层体系结构中的应用层协议 RTMP协议可以用来推送又可以用来直播 RTMP协议中基本的…

从真实项目中抠出来的设计模式——第一篇:策略模式

有时候因为种种原因导致我们会写出很多丑陋的代码&#xff0c;比如赶工时&#xff0c;短暂性的偷懒&#xff0c;不会设计模式等等导致代码沉积&#xff0c;一个cs上万行代码这样场景是有发生&#xff0c; 当然这里也包括我。。。所以时间充裕一点之后就想重构一下&#xff0c;…

jquery实现单击div切换背景,再次单击回到原来样式

首先来看看效果图&#xff1a; 1.这是默认的的div样式&#xff1a; 2.当我们单击第一个div时的样式&#xff1a; 3.当我们再次单击第一个div时的样式&#xff1a; 如果你需要的效果是这样的&#xff0c;那么请您继续往下面看&#xff0c;如果不是&#xff0c;您也可以看看实…

Java进阶之对象克隆(复制)

转载自 Java进阶之对象克隆&#xff08;复制&#xff09; 假如说你想复制一个简单变量。很简单&#xff1a; int apples 5; int pears apples; 不仅仅是int类型&#xff0c;其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况。 但…

wxapkg的html反编译,wxapkg反编译工具包

软件简介 Soft IntroductionWechat App微信小程序反编译解包工具wxapkg及相关文件(.wxss,.json,.wxs,.wxml)还原工具。wxappUnpacker版本V0.3&#xff0c;当前功能如下(分包功能尚未完成&#xff01;)将app-config.json中的内容拆分到各个文件对应的 .json和app.json , 并通过搜…

如何下载网页中的视频成mp4格式

1.在生活中&#xff0c;我们经常在网页上看到某个视频之后想要下载下来&#xff0c;可是&#xff0c;网上大部分的视频都在几大播放器所占领&#xff0c;比如爱奇艺、优酷、腾讯等等&#xff0c;当你在这些上面下载的时候会发现先要让你下载播放器&#xff0c;才能下载视频。这…

微软CNTK 2.0版本发布,支持C#

微软 CNTK 2.0 版本今天正式发布。 CNTK&#xff08;Cognitive Toolkit&#xff09;是微软的深度学习工具包&#xff0c;可以帮助企业加速图像和语音识别进程。有了今天的更新&#xff0c;企业可以在本地或云端结合 Azure GPU 使用 CNTK了。 伴随着今天的新版本发布&#xff0c…

Android碎片Fragment详讲(1)

Fragment Fragment创建的步骤 1、 继承fragment一定是V4包下的 2、 有且只有一个无参的构造方法 3、 如果Fragment需要显示界面&#xff0c;需要重写onCreateView方法 4、 指定布局资源&#xff0c;或者创建布局&#xff0c;返回即可 静态创建frag…

关于人脸和指纹识别共同交流方案

尊敬的各位朋友&#xff0c;各位粉丝&#xff1a; 非常感谢各位能从博客看到关于人脸识别的文章给我的评论以及点赞&#xff0c;也有好多粉丝从博客中直接加我的QQ&#xff0c;找我要js和jar包&#xff0c;我也大部分都给了。还有的找我要源码&#xff01;&#xff01;&#xf…