Android之Bitmap高效缓存以及android缓存策略
生活随笔
收集整理的這篇文章主要介紹了
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缓存策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cfhd电脑配置?
- 下一篇: Android碎片Fragment详讲(