您的位置:首页 > 其它

数据缓存的两种方法

2013-01-29 14:52 197 查看
数据缓存的两种方法:
1.数据缓存到/data/data目录(ROM) 数据缓存到手机的sd卡上
特殊的业务场景,不允许把缓存数据存到手机的rom或者sd卡上

2.把资源文件缓存到内存(RAM)里面,保证了数据的安全性,并且不会占用、多用的外存储空间

private Map<String,Bitmap> bitmapCache;
bitmapCache=new HashMap<String,Bitmap>();


每一次显示图片的时候,首先判断map缓存集合里面是否存在缓存的图片对象

OutOfMemoryException();


软引用:特殊的引用类型,当java虚拟机内存不足的时候,虚拟机的垃圾回收器会试图回收掉,采用软引用方式应用的对象,
以达到释放内存空间的作用。(特点是由java虚拟机来保证的)
强引用:默认的类型,如果一个对象 保存的有对应的引用,这个对象就不会被垃圾回收器所回收

//软引用的集合,软引用的集合里面的是一个bitmap的类型
private Map<String,SoftReference<Bitmap>> bitmapCache;

holder.iv.setImageBitmap(bitmapCache.get(book.getBookicon()).get());

SoftReference<T> 软引用的类型 T代表的是泛型

SoftReference <Bitmap> sr=new SoftReference<Bitmap>(bitmap)//向软引用里面存放一个bitmap

Bitmap bitmap=sr.get();//获取软引用里面存放的bitmap

//当内存不足的时候 sr里面存放的对象会被系统的垃圾回收器回收,sr.get()==null;


如果一个ListView里面有很多条目
分批的方式,或者分页的方式加载数据

一次从服务器上加载5条数目信息,当用户拖动界面到最下面的时候,加载更多的数据信息

1.给listView注册一个滚动的监听事件。
2.当用户把listView滚动到界面的最下面的时候,得到当前最后一个条目的position
3.根据这个position获取position~position+5的数据。
4.通知listview更新显示的数据内容

1.//给listview设置一个滚动的监听事件
list.setOnScrollListener(new OnScrollListener(){
/**
静止~滚动
滚动~静止
*/
public void onScrollStateChanged(AbsListView view,int scrollState){

if(isloading)//在加载数据的过程中 不再相应listview的拖动事件,防止加载错误的信息,防止加载错误的id
return;

if(scrollState==OnScrollListener.SCROLL_STATE_IDLE){
//如果listview里面最后一个可见的条目的id 等于当前listview里面元素的个数大小
//如果listview被拖动到了界面的最后一个条目
int lastPostion=list.getLastVisiblePosition();//从0开始
int size=books.size();//listview里面有多少个条目
if(lastPostion==(size-1)){
//代表最后一个可见的条目是listview的最后一个条目
//加载更多的内容
startPostion+=count;
//加载从startposition开始的数据
fillData();
}

}

}
public void onScroll(AbsListView view,int firstVisibleItem,int visibleItemCount,int totalItemCount){

}

});

//ListView的懒加载

//连接服务器下载图片到本地,缓存图片到本地sd卡上
Bitmap bitmap=BitmapFactory.decodeFile("/sdcard/a.jpg");//这个方法如果图片比较大 100k 150ms
bitmap.compress(CompressFormat.JPEG,20,outputStream);

//在SD卡上保存的有图片的原图,图片的缩略图

/**
当为了避免listview拖动的时候有卡顿的现象出现,在listview滚动的时候显示图片的缩略图
*/
case OnScrollListener.SCROLL_STATE_IDLE:
scrolling=false;
int position=lv.getFirstVisiblePosition();
//获取listview里面的某个孩子的view对象lv.getChildAt(index);
int count=lv.getChildCount();
for(int i=0;i<count;i++){
TextView tv=(TextView)lv.getChildAt(i);
int realpostion=position+i;
tv.setText("加载"+realpostion+"原图");
}


解决listview的快速拖动的问题
当listview在滚动状态下,不去加载listview里面真是的图片和内容,而是把一个缩略图加载界面上
当listview的滚动状态停止的时候 采取真正的更新里面的条目的内容

listview 属性

android:fastScrollEnabled="true" //如果listview有很多条目,在listview的右边会显示出来一个快速滚动的进度条
android:scrollbarstyle=""//设置滚动条的位置
scrollbars="none" //隐藏掉滚动条目

lv.addHeaderView(v);//在listview上面增加一个view
lv.addFooterView();//在listview尾部增加一个view


如果要在滚动的时候在中间显示东西
那么就注册onScrollListener 在onScroll事件中进行处理

//listview滚动的时候 调用的方法
private WindowManager wm;

wm=getWindowManager();

onScroll(){

if(tv_index=null){
tv_index=new TextView(this);
tv_index.setText((String)lv.ItemAtPosition(firstVisibleItem));
//这里的写法具体的查看豆瓣的第3天 视频19 code为listviewdemo
wm.addView(tv_index,params);
}
}


关于listview的优化:
1. listview的界面的优化:

android:divider="@android:color/transparent"  listview条目与条目之间的间隙的分割内容
android:paddingTop="5.0dip"   listview条目之间的间隙
android:listSelector="@color/transparent" listview点中的颜色变化
android:fastScrollEnabled="true"  如果listview有很多个条目 ,在listview的右边 会显示出来一个快速滚动的进度条
(listview里面的条目至少要滚动5个屏幕以上)
android:scrollbarStyle="outsideOverlay"
android:scrollbars="none"
footer view
header view
快速拖动时候的悬浮提示(window manager)

新浪微博的 那个下拉更新是怎么做的啊
listview的下啦更新.
1. 设置listview的headerview 显示 向下拖动 更新的(默认的 显示是隐藏的)

2. listview数据显示的优化.
复用历史缓存的view对象, convertView 减少 采用布局填充器服务 填充布局的次数,达到减少xml->view 操作的次数.
定义了静态的viewholder 储存了 view对象里面控件的引用, view.setTag() view.getTag(); 减少遍历view对象 树状结构的次数.
采用了内存缓存 缓存一些经常使用的数据
服务器上的图片,缓存这些图片,(缓存手机的内存卡,sd卡)利用softreference把图片给缓存到内存里面
listview的分页显示
//服务器需要提供接口, 一次获取一段的数据.
//数据库提供接口 ,一次查询一段的数据.
listview的延时加载
//如果listview里面要显示的有很多的数据, 我们不需要一次把所有的数据都获取出来.
//分段的方式 一段一段的把数据下载下来.
注册listview的 onScrollListener(); 发现最后一个可见的条目 为listview里面数据适配器里面的最后的一个条目, 加载更多的内容.


时间换空间: 内存不足,不能直接获取全部的数据,只能多花时间,一段一段的获取数据并显示

时间换时间: 开机优化, 开机的服务要启动,应用程序要启动加载.
如何优化android手机的启动速度, 如何优化android的虚拟机.

空间换空间: 大数据的交换和存储

空间换时间: 内存缓存 sd卡缓存 空间换时间.

解决listview的快速拖动的问题:
当listview在滚动状态下,不去加载listview里面真实的图片和内容,而是把一个缩略图加载界面上.
当listview的滚动状态停止的时候 才去真正的更新里面的条目的内容.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: