日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發布時間:2023/12/3 Android 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的命名有特殊要求 待完善!………………












總結

以上是生活随笔為你收集整理的Android之Bitmap高效缓存以及android缓存策略的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。