LocationManager.java 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. package com.yc.videosqllite.manager;
  2. import android.content.Context;
  3. import android.os.Debug;
  4. import com.yc.videosqllite.cache.VideoMapCache;
  5. import com.yc.videosqllite.disk.DiskFileUtils;
  6. import com.yc.videosqllite.disk.SqlLiteCache;
  7. import com.yc.videosqllite.model.VideoLocation;
  8. import com.yc.videosqllite.utils.CacheLogUtils;
  9. import java.io.IOException;
  10. /**
  11. * <pre>
  12. * @author yangchong
  13. * email : yangchong211@163.com
  14. * time : 2020/8/6
  15. * desc : 音视频播放记录本地缓存
  16. * revise: 最开始使用greenDao,二级缓存耗时100毫秒左右
  17. * 磁盘+内存+key缓存+读写优化,耗时大概2到5毫秒左右
  18. * </pre>
  19. */
  20. public class LocationManager {
  21. /**
  22. * 终极目标
  23. * 1.开发者可以自由切换缓存模式
  24. * 2.可以设置内存缓存最大值,设置磁盘缓存的路径
  25. * 3.能够有增删改查基础方法
  26. * 4.多线程下安全和脏数据避免
  27. * 5.代码体积小
  28. * 6.一键打印存取表结构日志
  29. * 7.如何一键将本地记录数据上传
  30. * 8.拓展性和封闭性
  31. * 9.性能,插入和获取数据,超1000条数据测试
  32. */
  33. /**
  34. * 内存缓存
  35. */
  36. private VideoMapCache videoMapCache;
  37. /**
  38. * 磁盘缓存
  39. */
  40. private SqlLiteCache sqlLiteCache;
  41. /**
  42. * 配置类
  43. */
  44. private CacheConfig cacheConfig;
  45. private static class ManagerHolder {
  46. private static final LocationManager INSTANCE = new LocationManager();
  47. }
  48. public static LocationManager getInstance() {
  49. return ManagerHolder.INSTANCE;
  50. }
  51. public void init(CacheConfig cacheConfig){
  52. this.cacheConfig = cacheConfig;
  53. CacheLogUtils.setIsLog(cacheConfig.isLog());
  54. videoMapCache = new VideoMapCache();
  55. sqlLiteCache = new SqlLiteCache();
  56. CacheLogUtils.d("LocationManager-----init初始化-");
  57. }
  58. public CacheConfig getCacheConfig() {
  59. if (cacheConfig==null){
  60. throw new RuntimeException("请先调用init方法进行初始化");
  61. }
  62. return cacheConfig;
  63. }
  64. /**
  65. * 存数据
  66. * url为什么要md5?思考一下……
  67. *
  68. * @param url 链接
  69. * @param location 视频数据
  70. */
  71. public synchronized void put(String url , VideoLocation location){
  72. if (!cacheConfig.isEffective()){
  73. return;
  74. }
  75. if (url==null || url.length()==0 || location==null){
  76. return ;
  77. }
  78. /*
  79. * type
  80. * 0,表示内存缓存
  81. * 1,表示磁盘缓存
  82. * 2,表示内存缓存+磁盘缓存
  83. */
  84. long currentTimeMillis1 = System.currentTimeMillis();
  85. if (cacheConfig.getType() ==1){
  86. //存储到磁盘中
  87. sqlLiteCache.put(url,location);
  88. } else if (cacheConfig.getType() ==2){
  89. //存储到内存中
  90. videoMapCache.put(url,location);
  91. //存储到磁盘中
  92. sqlLiteCache.put(url,location);
  93. } else if (cacheConfig.getType()==0){
  94. //存储到内存中
  95. videoMapCache.put(url,location);
  96. } else {
  97. //存储到内存中
  98. videoMapCache.put(url,location);
  99. }
  100. long currentTimeMillis2 = System.currentTimeMillis();
  101. CacheLogUtils.d("LocationManager-----put--存数据耗时-"+(currentTimeMillis2-currentTimeMillis1));
  102. }
  103. /**
  104. * 取数据
  105. * @param url 链接
  106. * @return
  107. */
  108. public synchronized long get(String url){
  109. if (!cacheConfig.isEffective()){
  110. return 0;
  111. }
  112. if (url==null || url.length()==0){
  113. return 0;
  114. }
  115. /*
  116. * type
  117. * 0,表示内存缓存
  118. * 1,表示磁盘缓存
  119. * 2,表示内存缓存+磁盘缓存
  120. */
  121. long currentTimeMillis1 = System.currentTimeMillis();
  122. long position;
  123. if (cacheConfig.getType() ==1){
  124. //从磁盘中查找
  125. position = sqlLiteCache.get(url);
  126. } else if (cacheConfig.getType() ==2){
  127. //先从内存中找
  128. position = videoMapCache.get(url);
  129. if (position<0){
  130. //内存找不到,则从磁盘中查找
  131. position = sqlLiteCache.get(url);
  132. }
  133. } else if (cacheConfig.getType()==0){
  134. //先从内存中找
  135. position = videoMapCache.get(url);
  136. } else {
  137. //先从内存中找
  138. position = videoMapCache.get(url);
  139. }
  140. long currentTimeMillis2 = System.currentTimeMillis();
  141. CacheLogUtils.d("LocationManager-----get--取数据耗时-"+(currentTimeMillis2-currentTimeMillis1)
  142. + "---进度-"+position);
  143. return position;
  144. }
  145. /**
  146. * 移除数据
  147. * @param url 链接
  148. * @return
  149. */
  150. public synchronized boolean remove(String url){
  151. if (!cacheConfig.isEffective()){
  152. return false;
  153. }
  154. if (url==null || url.length()==0){
  155. return false;
  156. }
  157. /*
  158. * type
  159. * 0,表示内存缓存
  160. * 1,表示磁盘缓存
  161. * 2,表示内存缓存+磁盘缓存
  162. */
  163. if (cacheConfig.getType() ==1){
  164. return sqlLiteCache.remove(url);
  165. } else if (cacheConfig.getType() ==2){
  166. boolean remove = videoMapCache.remove(url);
  167. boolean removeSql = sqlLiteCache.remove(url);
  168. return remove || removeSql;
  169. } else if (cacheConfig.getType()==0){
  170. return videoMapCache.remove(url);
  171. } else {
  172. return videoMapCache.remove(url);
  173. }
  174. }
  175. /**
  176. * 是否包含
  177. * @param url 链接
  178. * @return
  179. */
  180. public synchronized boolean containsKey(String url){
  181. if (!cacheConfig.isEffective()){
  182. return false;
  183. }
  184. if (url==null || url.length()==0){
  185. return false;
  186. }
  187. /*
  188. * type
  189. * 0,表示内存缓存
  190. * 1,表示磁盘缓存
  191. * 2,表示内存缓存+磁盘缓存
  192. */
  193. boolean containsKey;
  194. if (cacheConfig.getType() ==1){
  195. containsKey = sqlLiteCache.containsKey(url);
  196. } else if (cacheConfig.getType() ==2){
  197. containsKey = videoMapCache.containsKey(url);
  198. if (!containsKey){
  199. containsKey = sqlLiteCache.containsKey(url);
  200. return containsKey;
  201. }
  202. } else if (cacheConfig.getType()==0){
  203. containsKey = videoMapCache.containsKey(url);
  204. } else {
  205. containsKey = videoMapCache.containsKey(url);
  206. }
  207. return containsKey;
  208. }
  209. /**
  210. * 清楚所有数据
  211. * @return 是否清楚完毕
  212. */
  213. public synchronized void clearAll(){
  214. if (!cacheConfig.isEffective()){
  215. return;
  216. }
  217. /*
  218. * type
  219. * 0,表示内存缓存
  220. * 1,表示磁盘缓存
  221. * 2,表示内存缓存+磁盘缓存
  222. */
  223. if (cacheConfig.getType() ==1){
  224. sqlLiteCache.clearAll();
  225. } else if (cacheConfig.getType() ==2){
  226. videoMapCache.clearAll();
  227. sqlLiteCache.clearAll();
  228. } else if (cacheConfig.getType()==0){
  229. videoMapCache.clearAll();
  230. } else {
  231. videoMapCache.clearAll();
  232. }
  233. }
  234. /**
  235. * 获取当前应用使用的内存
  236. * @return
  237. */
  238. public long getUseMemory(){
  239. long totalMemory = Runtime.getRuntime().totalMemory();
  240. long freeMemory = Runtime.getRuntime().freeMemory();
  241. CacheLogUtils.d("LocationManager-----内存-"+totalMemory+"-----"+freeMemory);
  242. //long maxMemory = Runtime.getRuntime().maxMemory();
  243. long useMemory = totalMemory - freeMemory;
  244. CacheLogUtils.d("LocationManager-----获取当前应用使用的内存-"+useMemory);
  245. return useMemory;
  246. }
  247. /**
  248. * 设定内存的阈值
  249. * @param proportion 比例
  250. * @return
  251. */
  252. public long setMemoryThreshold(int proportion){
  253. if (proportion<0 || proportion>10){
  254. proportion = 2;
  255. }
  256. long totalMemory = Runtime.getRuntime().totalMemory();
  257. long threshold = totalMemory / proportion;
  258. CacheLogUtils.d("LocationManager-----设定内存的阈值-"+threshold);
  259. return threshold;
  260. }
  261. /**
  262. * 获取Java内存快照文件
  263. * @param context
  264. */
  265. public void dumpHprofData(Context context){
  266. String dump = DiskFileUtils.getPath(context, "dump");
  267. CacheLogUtils.d("LocationManager-----获取Java内存快照文件-"+dump);
  268. try {
  269. Debug.dumpHprofData(dump);
  270. } catch (IOException e) {
  271. e.printStackTrace();
  272. }
  273. }
  274. }