1. 程式人生 > >LruCache快取圖片+清除本地快取

LruCache快取圖片+清除本地快取

/**
 *
 * 本應用資料清除管理器
 */
public class DataClearManager {


    /**
     * 獲取本應用快取大小
     * @param context
     * @return
     */
    public static String getTotalCacheSize(Context context) throws Exception {
        long cacheSize = getFolderSize(context.getCacheDir());//快取路徑---/data/data/com.xxx.xxx/cache - 應用內快取(注:對應方法getCacheDir())
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//判斷sd卡有沒有正常掛載
            cacheSize += getFolderSize(context.getExternalCacheDir());//sd卡外部的快取路徑
        }
        return getFormatSize(cacheSize);
    }

    /**
     * * 清除本應用所有的資料 * *
     * @param context 上下文物件
     * @param filepath  自定義的快取路徑(清除自定義路徑下的檔案)
     */
    public static void cleanApplicationData(Context context, String... filepath) {
        cleanInternalCache(context);
        cleanExternalCache(context);
        cleanDatabases(context);
        cleanSharedPreference(context);
        cleanFiles(context);
        if (filepath == null) {
            return;
        }
        for (String filePath : filepath) {
            cleanCustomCache(filePath);
        }
    }



    /**
     * * 清除本應用內部快取(/data/data/com.xxx.xxx/cache) * *
     *
     * @param context
     */
    public static void cleanInternalCache(Context context) {
        deleteFilesByDirectory(context.getCacheDir());
    }

    /**
     * * 清除本應用所有資料庫(/data/data/com.xxx.xxx/databases) * *
     *
     * @param context
     */
    public static void cleanDatabases(Context context) {
        deleteFilesByDirectory(new File("/data/data/"
                + context.getPackageName() + "/databases"));
    }

    /**
     * * 清除本應用SharedPreference(/data/data/com.xxx.xxx/shared_prefs) *
     *
     * @param context
     */
    public static void cleanSharedPreference(Context context) {
        deleteFilesByDirectory(new File("/data/data/"
                + context.getPackageName() + "/shared_prefs"));
    }

    /**
     * * 按名字清除本應用資料庫 * *
     *
     * @param context
     * @param dbName
     */
    public static void cleanDatabaseByName(Context context, String dbName) {
        context.deleteDatabase(dbName);
    }

    /**
     * * 清除/data/data/com.xxx.xxx/files下的內容 * *
     *
     * @param context
     */
    public static void cleanFiles(Context context) {
        deleteFilesByDirectory(context.getFilesDir());
    }

    /**
     * * 清除外部cache下的內容(/mnt/sdcard/android/data/com.xxx.xxx/cache)
     *
     * @param context
     */
    public static void cleanExternalCache(Context context) {
        if (Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            deleteFilesByDirectory(context.getExternalCacheDir());
        }
    }

    /**
     * * 清除自定義路徑下的檔案,使用需小心,請不要誤刪。而且只支援目錄下的檔案刪除 * *
     *
     * @param filePath
     */
    public static void cleanCustomCache(String filePath) {
        deleteFilesByDirectory(new File(filePath));
    }



    /**
     * * 刪除方法 這裡只會刪除某個資料夾下的檔案,如果傳入的directory是個檔案,將不做處理 * *
     *
     * @param directory
     */
    private static void deleteFilesByDirectory(File directory) {
        if (directory != null && directory.exists() && directory.isDirectory()) {
            for (File item : directory.listFiles()) {
                item.delete();
            }
        }
    }

    // 獲取檔案
    //Context.getExternalFilesDir() --> SDCard/Android/data/你的應用的包名/files/ 目錄,一般放一些長時間儲存的資料
    //Context.getExternalCacheDir() --> SDCard/Android/data/你的應用包名/cache/目錄,一般存放臨時快取資料
    public static long getFolderSize(File file) throws Exception {
        long size = 0;
        try {
            File[] fileList = file.listFiles();
            for (File aFileList : fileList) {
                // 如果下面還有檔案
                if (aFileList.isDirectory()) {
                    size = size + getFolderSize(aFileList);
                } else {
                    size = size + aFileList.length();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return size;
    }

    /**
     * 刪除指定目錄下檔案及目錄
     *
     * @param deleteThisPath

     * @return
     */
    public static void deleteFolderFile(String filePath, boolean deleteThisPath) {
        if (!TextUtils.isEmpty(filePath)) {
            try {
                File file = new File(filePath);
                if (file.isDirectory()) {// 如果下面還有檔案
                    File files[] = file.listFiles();
                    for (File file1 : files) {
                        deleteFolderFile(file1.getAbsolutePath(), true);
                    }
                }
                if (deleteThisPath) {
                    if (!file.isDirectory()) {// 如果是檔案,刪除
                        file.delete();
                    } else {// 目錄
                        if (file.listFiles().length == 0) {// 目錄下沒有檔案或者目錄,刪除
                            file.delete();
                        }
                    }
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    /**
     * 格式化單位
     *
     * @param size
     * @return
     */
    public static String getFormatSize(double size) {
        double kiloByte = size / 1024;
        if (kiloByte < 1) {
            return size + "Byte";
        }

        double megaByte = kiloByte / 1024;
        if (megaByte < 1) {
            BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));
            return result1.setScale(2, BigDecimal.ROUND_HALF_UP)
                    .toPlainString() + "KB";
        }

        double gigaByte = megaByte / 1024;
        if (gigaByte < 1) {
            BigDecimal result2 = new BigDecimal(Double.toString(megaByte));
            return result2.setScale(2, BigDecimal.ROUND_HALF_UP)
                    .toPlainString() + "MB";
        }

        double teraBytes = gigaByte / 1024;
        if (teraBytes < 1) {
            BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));
            return result3.setScale(2, BigDecimal.ROUND_HALF_UP)
                    .toPlainString() + "GB";
        }
        BigDecimal result4 = new BigDecimal(teraBytes);
        return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()
                + "TB";
    }

    public static String getCacheSize(File file) throws Exception {
        return getFormatSize(getFolderSize(file));
    }

}

/**
 * Created by jane on 2017/12/20.
 *
 * LruCache  LinkedHashMap
 * lru演算法 最近最少使用演算法
 */

public class LruCacheUtils {
    //申明記憶體快取
    private LruCache<String,Bitmap> mLruCache;


    //在構造方法中進行初使化
    public LruCacheUtils(Context context) {
        //得到當前應用程式的記憶體
        int maxMemory=(int)Runtime.getRuntime().maxMemory();
        //記憶體快取為當前應用程式的8分之1
        int cacheMemory=maxMemory/8;

        //進行初使化-指定快取空間的大小
        mLruCache=new LruCache<String, Bitmap>(cacheMemory){
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getByteCount();//自定義bitmap資料大小的計算方式
            }
        };
    }

    /**
     * 儲存圖片到記憶體快取
     * @param key 圖片的url
     * @param bitmap 圖片
     */
    public void savePicToMemory(String key,Bitmap bitmap){
        try {
            mLruCache.put(key,bitmap);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 通過key值得到快取的圖片
     * @param key 圖片的url地址
     * @return Bitmap 或 null
     */
    public  Bitmap getPicFromMemory(String key){

        Bitmap bitmap=null;
        try {
            //通過key獲取圖片
            bitmap= mLruCache.get(key);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return bitmap;
    }

    /**
     * 清除快取
     * evict:驅逐 逐出
     */
    public void clearCache() {
        if (mLruCache != null) {
            if (mLruCache.size() > 0) {
                Log.d("CacheUtils",
                        "mMemoryCache.size() " + mLruCache.size());
                mLruCache.evictAll();

                Log.d("CacheUtils", "mMemoryCache.size()" + mLruCache.size());
            }
            mLruCache = null;
        }
    }

}

//呼叫工具類-初使化
        LruCacheUtils lruCacheUtils = new LruCacheUtils(getActivity());

        btnAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //首先判斷記憶體中圖片有沒有快取
                Bitmap bitmap=lruCacheUtils.getPicFromMemory(picurl);

                if(bitmap!=null){
                    Toast.makeText(getActivity(),"從記憶體快取中獲取!",Toast.LENGTH_SHORT).show();
                    imageView.setImageBitmap(bitmap);
                }else {
                    //從網路獲取
                    new MyPicTask().execute(picurl);
                }
            }

        });

  class MyPicTask extends AsyncTask<String,Void,Bitmap> {

        @Override
        protected Bitmap doInBackground(String... strings) {

            try {
                //使用HttpUrlConnection
                URL url=new URL(strings[0]);
                HttpURLConnection connection=(HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
                connection.setReadTimeout(5000);
                connection.setConnectTimeout(5000);

                if(connection.getResponseCode()==200){
                    InputStream inputStream=connection.getInputStream();
                    return BitmapFactory.decodeStream(inputStream);
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            //顯示圖片
            imageView.setImageBitmap(bitmap);
            //儲存在記憶體快取中
            lruCacheUtils.savePicToMemory(picurl,bitmap);
        }
    }

  try {
            //獲取本應用的快取大小
           String cacheSize= DataClearManager.getTotalCacheSize(getActivity());
           textView.setText(cacheSize);


        } catch (Exception e) {
            e.printStackTrace();
        }

        btnClear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //清空快取
                DataClearManager.cleanApplicationData(getActivity());
            }
        });

相關推薦

LruCache快取圖片+清除本地快取

/** * * 本應用資料清除管理器 */public class DataClearManager {    /**     * 獲取本應用快取大小     * @param context     * @return     */    public static Str

Vue+mui實現圖片本地快取

效果: const menu = { state: { products: {}, GLOBAL_CONFIG:GLOBAL_CONFIG['GLOBAL_CONFIG'] }, mutations: { get_p

Glide快取圖片清除快取,百度地圖定位

1.匯入百度地圖jar包與jniLibs檔案,獲取到appId 2.清單檔案 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.c

小程式-圖片/檔案本地快取,減少CDN流量消耗

## [♠](#1) 寫在前面 小程式網路圖片讀取: 1. 在讀取OSS圖片CDN分發時流量大量消耗,導致資金費用增加。 2. 網路圖片比較大時,圖片載入緩慢。 為了儘量減少上面兩個問題,所以對已讀的圖片進行快取處理,減少多次訪問不必要的流量消耗。 ## [♠](#2) 小程式的檔案系統 檔案主要分

center os 記憶體快取爆滿 清除記憶體快取及檢視狀態

[[email protected] chat]# free -m total used free shared buffers cached Mem: 15830

java 快取架構剖析--本地快取(LoadingCache)

快取的使用可以大大提高程式的執行效率,但是如果快取無法及時更新會導致髒讀的情況。 痛點剖析: 記得早期我呆過的一家公司有個核心服務是在啟動的時候一下把常用的交易配置資訊是從DB查出來放在Map裡面來做快取,先不考慮其他的,如果我想更新一下交易配置資訊是不是需要每次都重啟伺

Universalimageloader圖片載入框架快取本地圖片的使用

Universalimageloader圖片載入框架快取本地圖片的使用 首先需要新增依賴: ​ …………… 在專案中建立一個自己的Application,編寫以下程式碼: public class NewsApplication extends Application {

web本地客戶端快取圖片實現

瀏覽器快取是提高使用者體驗和提升程式效能的一個很重要的途徑,通過瀏覽器的快取控制,可以對實時性要求不高的資料進行快取,可以減少甚至不需要再次對伺服器的請求就可以顯示資料。 本文將介紹如果通過HTTP協議中的header來控制瀏覽器的快取行為,建議大家在看的時候寫程式碼試驗下,這樣對這些header的理解

針對單張大圖片本地快取,依賴於DClound平臺的H5+plus技術

需求 最近專案中遇到移動端首頁需要載入一些圖片,並且有些圖片很大並且更新不頻繁 原理 原理就是根據網路圖片的的url來判定本地是否存在該圖片,不存在就根據網路圖片的url下載該圖片,並把頁面上的圖片路徑替換成本地快取路徑;如果存在就直接使用本地圖片路徑。 準備 需要學習的

ImageLoader獲取本地快取圖片的bitmap

在初始化imageoption的時候,如果我們呼叫了.cacheInMemory()和.cacheOnDisc(),載入圖片使用這個Option,圖片載入完成以後就會快取到記憶體和本地儲存中; 這時候 如果是載入過的圖片,我們直接載入的時候,出現的之前存的圖片,這樣就不會消

安卓快取LruCache及設計(非同步+快取圖片載入器LruCacheImageLoader

一、LruCache LruCache是一套記憶體快取的解決方案,演算法基於LRU。 LRU:Least Recently Used(近期最少使用)。LruCache基於LRU演算法的快取策略。 LruCache是一個泛型類,其以強引用的方式

android--------Universal-Image-Loader圖片載入框架和結合LruCache快取圖片

本部落格包含包含Android-Universal-Image-Loader 網路圖片載入框架實現圖片載入和結合universal-image-loader與LruCache來自定義快取圖片,可以設定快取與不快取。 Android-Universal-Image-Load

Android 獲取遠端圖片本地圖片快取

 對圖片來說,你不可能讓應用每次獲取的時候都重新到遠端伺服器去下載,特別是顯示ListView中的圖片的時候,滑動的速度變得很快,這樣將會造成ANR,即使圖片比較小,但是圖片還沒來得及釋放的話,累計的圖片將會佔用比較大的記憶體,但是又不能將所有的圖片資源在獲取之後放在記憶體中,使用弱引用儲存物件的方法儲存,因

【Android】Picasso載入本地圖片如何清理快取cache?

使用Picasso載入SD卡圖片的時候,Picasso也會對該圖片進行快取。所以如果該圖片即使已經變了,Picasso在載入時會仍然使用快取,而不更新圖片。 Picasso快取策略 我們都知道圖片快取使用的是Map鍵值對儲存的,這裡的Key就

如何在MAC OS,Linux和Windows清除本地DNS快取

對於經常攜帶筆記本辦公的人士,有時候會發現在一個地方上網好好的,但是換了一個地方就上不了網,重複開關機也不行,但是別人電腦訪問確實沒有問題的。而且奇蹟的是,過了一些時間,再訪問同樣的網站,竟然自己好了,這個有可能是本地DNS快取的在作祟。 下面分別介紹不同作業系統清除快

Unity+NGUI打造網路圖片非同步載入與本地快取工具類(一)

我們在移動端的開發中,非同步網路圖片載入用的非常的多,在unity當中雖然有AssetBundle的存在,一般是先載入好遊戲資源然後再進入場景,但是還有不少地方能夠用到非同步網路圖片的載入以及其快取機制。 我之前也寫過兩個版本的ios中的非同步網路圖片載入helper類,所

圖片本地快取

圖片懶載入是通過判斷http圖片檔案是否存在你的本地,如果未存在會將圖片快取到本地,如果已經存在就不做快取,使用到的技術md5加密,mui、html5+. 應客戶的要求,需要做懶載入,本人也找了一段時間才找到這個程式碼,因為是非同步載入的,為了配合mui,我添

清除快取圖片

local _path = cc.FileUtils:getInstance():getWritablePath() .. "FaceID/" .. gameManager.userInfo.dwUserID .. ".png" cc.Director:getInstan

本地及伺服器如何清除redis快取

1、本地環境清除redis快取 清除快取命令為flushall,如下圖所示: 2、伺服器上清除redis快取 我們伺服器用的是Linux系統,我是用putty進行管理的,同上登陸伺服器, 任意資料夾下執行redis-cli ,進入redis,執行flushal

Android Fresco獲取本地快取圖片

相信大家用過Fresco的都知道Android一個非常強大的Fresco圖片載入框架自帶三級快取功能.1.Bitmap快取Bitmap快取儲存Bitmap物件,這些Bitmap物件可以立刻用來顯示或者用於後處理在5.0以下系統,Bitmap快取位於ashmem,這樣Bitma