package com.ywwxhz.lib.kits; import android.content.Context; import android.os.Handler; import android.os.Looper; import android.os.Message; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.io.File; import java.lang.ref.WeakReference; /** * Created by ywwxhz on 2014/10/17. */ public class FileCacheKit { private static final int MESSAGE_FINISH = 0x01; private static FileCacheKit fileCacheKit; private File cacheDir; FileCacheKit(File cacheDir) { this.cacheDir = cacheDir; } FileCacheKit(Context context) { this.cacheDir = context.getCacheDir(); } public static FileCacheKit getInstance(File cacheDir) { if (fileCacheKit == null) { fileCacheKit = new FileCacheKit(cacheDir); } return fileCacheKit; } public static FileCacheKit getInstance() { if (fileCacheKit == null) throw new NullPointerException( "must getInstance(File cacheDir) before getInstance()"); return fileCacheKit; } public static FileCacheKit getInstance(Context context) { if (fileCacheKit == null) { fileCacheKit = new FileCacheKit(context); } return fileCacheKit; } public void put(String filename, String value) { put(filename, value, "json"); } public void put(String filename, String value, String type) { FileKit.writeFile(cacheDir, filename + "." + type, value); } public void putAsync(String key, String value, FileCacheListener listener) { putAsync(key, value, "json", listener); } public void putAsync(String key, String value, String type, FileCacheListener listener) { FileCacheHandler handler = null; if (listener != null) { handler = new FileCacheHandler(listener); } new FileCacheSaveThread(key, value, type, handler).start(); } public void putObject(String filename, Object value) { Gson gson = new Gson(); put(filename, gson.toJson(value)); } public void getAsync(String key, FileCacheListener listener) { FileCacheHandler handler = null; if (listener != null) { handler = new FileCacheHandler(listener); } new FileCacheGetThread(key, handler).start(); } public String getAsString(String filename) { return getAsString(filename, "json"); } public String getAsString(String filename, String type) { return FileKit.getFileContent(cacheDir, filename + "." + type); } public <T> T getAsObject(String key, Class<T> clazz) { return getAsObject(key, "json", clazz); } public <T> T getAsObject(String key, String type, Class<T> clazz) { Gson gson = new Gson(); String tmp = getAsString(key, type); if (tmp == null) { return null; } else { try { return gson.fromJson(tmp, clazz); } catch (Exception e) { return null; } } } public <T> T getAsObject(String key, TypeToken<T> typeToken) { return getAsObject(key, "json", typeToken); } public <T> T getAsObject(String key, String type, TypeToken<T> typeToken) { Gson gson = new Gson(); String tmp = getAsString(key, type); if (tmp == null) { return null; } else { try { return gson.fromJson(tmp, typeToken.getType()); } catch (Exception e) { return null; } } } public void cleanCache() { File[] files = cacheDir.listFiles(); if (files != null) { for (File f : files) { f.delete(); } } } public long getCacheSize() { try { return FileKit.getFolderSize(cacheDir); } catch (Exception e) { e.printStackTrace(); return 0; } } public File getCacheDir() { return cacheDir; } public interface FileCacheListener { public void onFinish(String obj); } private class FileCacheSaveThread extends Thread { private String key; private String value; private String type; private FileCacheHandler handler; protected FileCacheSaveThread(String key, String value, String type, FileCacheHandler handler) { this.key = key; this.type = type; this.value = value; this.handler = handler; } @Override public void run() { put(key, value, type); if (handler != null) { Message msg = new Message(); msg.what = MESSAGE_FINISH; msg.obj = ""; handler.sendMessage(msg); } } } private class FileCacheGetThread extends Thread { private String key; private FileCacheHandler handler; protected FileCacheGetThread(String key, FileCacheHandler handler) { this.key = key; this.handler = handler; } @Override public void run() { if (handler != null) { Message msg = new Message(); msg.what = MESSAGE_FINISH; msg.obj = getAsString(key); handler.sendMessage(msg); } } } private static class FileCacheHandler extends Handler { private WeakReference<FileCacheListener> listener; private FileCacheHandler(FileCacheListener listener) { super(Looper.getMainLooper()); this.listener = new WeakReference<>(listener); } @Override public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_FINISH: if (listener != null) { listener.get().onFinish((String) msg.obj); } break; } super.handleMessage(msg); } } }