android计算缓存大小
Ⅰ 请教贴android本地缓存机制
Android中提供的缓存机制是利用本地存储实现的。
(1)新下载数据的时候,将数据缓存到本地。
(2)再次下载之前,先判定该资源是否已经被缓存,如果是,则优先使用本地资源;如果没有被缓存,则凑个网络上下载资源,并进行缓存。
实际上使用缓存机制的时候,还要考虑到额外的两个条件:空间和时间。
对于存储空间的条件限制,处理方法一般是结合应用下载量大小和用户选择来确定,比如以缓存文本为主的应用,由于文本本身占用极小的空间,其缓存大小可以根据用户的磁盘空间大小来确定;以缓存图片为主应用,由于图片占用空间较大,更加需要用户参与指定空间大小。
对于时间的限制,可以通过设定缓存的过期时间来实现,为下载到缓存的数据设定时间戳,在读取该缓存的时候,比较时间戳,超过时间限制的则需要更新该缓存。
在清空应用缓存的时候也需要谨慎,在存储空间已满,用户注销的时候可以考虑清空该用户的整个缓存,而在普通升级应用的情况下并不需要清空整个缓存。
Ⅱ android 怎么做数据缓存
二级缓存工作机制
所谓二级缓存实际上并不复杂,当Android端需要获得数据时比如获取网络中的图片,我们首先从内存中查找(按键查找),内存中没有的再从磁盘文件或sqlite中去查找,若磁盘中也没有才通过网络获取;当获得来自网络的数据,就以key-value对的方式先缓存到内存(一级缓存),同时缓存到文件或sqlite中(二级缓存)。注意:内存缓存会造成堆内存泄露,所有一级缓存通常要严格控制缓存的大小,一般控制在系统内存的1/4。
理解了二级缓存大家可能会有个问题网络中的数据是变化的,数据一旦放入缓存中,再取该数据就是从缓存中获得,这样岂不是不能体现数据的变化?我们在缓存数据时会设置有效时间,比如说30分钟,若超过这个时间数据就失效并释放空间,然后重新请求网络中的数据。有的童鞋就问30分钟内咋办?那好吧,我也没招了,只有下拉刷新了, 实际上这不是问题。
二级缓存的实现
如何实现二级缓存,有很多技术方案,在这里我们使用 ASimpleCache框架来给大家演示一下,通过名字就可以看出它是很容易实现的。
1、ACache介绍
ASimpleCache是一个轻量级的开源cache框架,实际上就是一个叫ACache的java类。已经在商业项目中使用,运行效果不错。
2、ACache使用
我们先做一个实现数据缓存的案例,然后再归纳一下主要的方法
编写NewsListActivity主要代码如下:
创建ACache组件
ACache acache=ACache.get(context)
或
ACache acache=ACache.get(context,max_size,max_count)
参数说明:
max_size:设置限制缓存大小,默认为50M
max_count:设置缓存数据的数量,默认不限制
设置缓存数据
acache.put(key,data,time)或acache.put(key,data)
将数据同时上存入一级缓存(内存Map)和二级缓存(文件)中
参数说明:
Key:为存入缓存的数据设置唯一标识,取数据时就根据key来获得的
Data:要存入的数据,acache支持的数据类型如图所示:
有String、可序列化的对象、字节数组、Drawable等Time:设置缓存数据的有效时间,单位秒
从缓存中取数据
提供一系列getAsXXX()方法,如图所示。
根据不同存入数据,调用不同的方法取数据
Ⅲ android开发中常用的网络连接方式有哪些
告诉你几个代码把,这些都是连接方式:
Activity.startActivities() 常用于在应用程序中间启动其他的Activity.
TextUtils.isEmpty() 简单的工具类,用于检测是否为空
Html.fromHtml() 用于生成一个Html,参数可以是一个字符串.个人认为它不是很快,所以我不怎么经常去用.(我说不经常用它是为了重点突出这句话:请多手动构建 Spannable 来替换 Html.fromHtml),但是它对渲染从 web 上获取的文字还是很不错的。
TextView.setError() 在验证用户输入的时候很棒
Build.VERSION_CODES 这个标明了当前的版本号,在处理兼容性问题的时候经常会用到.点进去可以看到各个版本的不同特性
Log.getStackTraceString() 方便的日志类工具,方法Log.v()、Log.d()、Log.i()、Log.w()和Log.e()都是将信息打印到LogCat中,有时候需要将出错的信息插入到数据库或一个自定义的日志文件中,那么这种情况就需要将出错的信息以字符串的形式返回来,也就是使用static String getStackTraceString(Throwable tr)方法的时候.
LayoutInflater.from() 顾名思义,用于Inflate一个layout,参数是layout的id.这个经常写Adapter的人会用的比较多.
ViewConfiguration.getScaledTouchSlop() 使用 ViewConfiguration 中提供的值以保证所有触摸的交互都是统一的。这个方法获取的值表示:用户的手滑动这个距离后,才判定为正在进行滑动.当然这个值也可以自己来决定.但是为了一致性,还是使用标准的值较好.
PhoneNumberUtils.convertKeypadLettersToDigits 顾名思义.将字母转换为数字,类似于T9输入法,
Context.getCacheDir() 获取缓存数据文件夹的路径,很简单但是知道的人不多,这个路径通常在SD卡上(这里的SD卡指的是广义上的SD卡,包括外部存储和内部存储)Adnroid/data/您的应用程序包名/cache/ 下面.测试的时候,可以去这里面看是否缓存成功.缓存在这里的好处是:不用自己再去手动创建文件夹,不用担心用户把自己创建的文件夹删掉,在应用程序卸载的时候,这里会被清空,使用第三方的清理工具的时候,这里也会被清空.
ArgbEvaluator 用于处理颜色的渐变。就像 Chris Banes 说的一样,这个类会进行很多自动装箱的操作,所以最好还是去掉它的逻辑自己去实现它。这个没用过,不明其所以然,回头再补充.
ContextThemeWrapper 方便在运行的时候修改主题.
Space space是Android 4.0中新增的一个控件,它实际上可以用来分隔不同的控件,其中形成一个空白的区域.这是一个轻量级的视图组件,它可以跳过Draw,对于需要占位符的任何场景来说都是很棒的。
ValueAnimator.reverse() 这个方法可以很顺利地取消正在运行的动画.我超喜欢.
DateUtils.formatDateTime() 用来进行区域格式化工作,输出格式化和本地化的时间或者日期。
AlarmManager.setInexactRepeating 通过闹铃分组的方式省电,即使你只调用了一个闹钟,这也是一个好的选择,(可以确保在使用完毕时自动调用 AlarmManager.cancel ()。原文说的比较抽象,这里详细说一下:setInexactRepeating指的是设置非准确闹钟,使用方法:alarmManager.setInexactRepeating(AlarmManager.RTC, startTime,intervalL, pendingIntent),非准确闹钟只能保证大致的时间间隔,但是不一定准确,可能出现设置间隔为30分钟,但是实际上一次间隔20分钟,另一次间隔40分钟。它的最大的好处是可以合并闹钟事件,比如间隔设置每30分钟一次,不唤醒休眠,在休眠8小时后已经积累了16个闹钟事件,而在手机被唤醒的时候,非准时闹钟可以把16个事件合并为一个, 所以这么看来,非准时闹钟一般来说比较节约能源。
Formatter.formatFileSize() 一个区域化的文件大小格式化工具。通俗来说就是把大小转换为MB,G,KB之类的字符串。
ActionBar.hide()/.show() 顾名思义,隐藏和显示ActionBar,可以优雅地在全屏和带Actionbar之间转换。
Linkify.addLinks() 在Text上添加链接。很实用。
StaticLayout 在自定义 View 中渲染文字的时候很实用。
Activity.onBackPressed() 很方便的管理back键的方法,有时候需要自己控制返回键的事件的时候,可以重写一下。比如加入 “点两下back键退出” 功能。
GestureDetector 用来监听和相应对应的手势事件,比如点击,长按,慢滑动,快滑动,用起来很简单,比你自己实现要方便许多。
DrawFilter 可以让你在不调用onDrew方法的情况下,操作canvas,比了个如,你可以在创建自定义 View 的时候设置一个 DrawFilter,给父 View 里面的所有 View 设置反别名。
ActivityManager.getMemoryClass() 告诉你你的机器还有多少内存,在计算缓存大小的时候会比较有用.
ViewStub 它是一个初始化不做任何事情的 View,但是之后可以载入一个布局文件。在慢加载 View 中很适合做占位符。唯一的缺点就是不支持标签,所以如果你不太小心的话,可能会在视图结构中加入不需要的嵌套。
SystemClock.sleep() 这个方法在保证一定时间的 sleep 时很方便,通常我用来进行 debug 和模拟网络延时。
DisplayMetrics.density 这个方法你可以获取设备像素密度,大部分时候最好让系统来自动进行缩放资源之类的操作,但是有时候控制的效果会更好一些.(尤其是在自定义View的时候).
Ⅳ 安卓怎样获得所有的APP缓存使用getPackageSizeInfo
首先,需要获得所有已经安装的程序的基本信息通过packageManager来拿到
[java] view plain
List<PackageInfo> installedPackages = manager.getInstalledPackages(0);
拿到所有的程序基本信息后,通过for循环来拿到程序的包名,然后通过查询android源码,在setting里面找到了拿到缓存大小的源码,通过packageManager的getPackageSizeInfo方法来拿到。
[java] view plain
public abstract void getPackageSizeInfo(String packageName, int userHandle,
IPackageStatsObserver observer);
然而这个方法是隐藏的,我们通过反射来拿到这个方法
[java] view plain
Class<?> loadClass = getClassLoader().loadClass("android.content.pm.PackageManager");
Method method = loadClass.getDeclaredMethod("getPackageSizeInfo", String.class,int.class,IPackageStatsObserver.class);