数据缓存的两种方法:
1.数据缓存到/data/data目录(ROM) 数据缓存到手机的sd卡上
特殊的业务场景,不允许把缓存数据存到手机的rom或者sd卡上
2.把资源文件缓存到内存(RAM)里面,保证了数据的安全性,并且不会占用、多用的外存储空间
1 private Map<String,Bitmap> bitmapCache; 2 bitmapCache=new HashMap<String,Bitmap>();
每一次显示图片的时候,首先判断map缓存集合里面是否存在缓存的图片对象
1 OutOfMemoryException();
软引用:特殊的引用类型,当java虚拟机内存不足的时候,虚拟机的垃圾回收器会试图回收掉,采用软引用方式应用的对象,
以达到释放内存空间的作用。(特点是由java虚拟机来保证的)
强引用:默认的类型,如果一个对象 保存的有对应的引用,这个对象就不会被垃圾回收器所回收
1 //软引用的集合,软引用的集合里面的是一个bitmap的类型 2 private Map<String,SoftReference<Bitmap>> bitmapCache; 3 4 holder.iv.setImageBitmap(bitmapCache.get(book.getBookicon()).get()); 5 6 7 SoftReference<T> 软引用的类型 T代表的是泛型 8 9 SoftReference <Bitmap> sr=new SoftReference<Bitmap>(bitmap)//向软引用里面存放一个bitmap 10 11 Bitmap bitmap=sr.get();//获取软引用里面存放的bitmap 12 13 //当内存不足的时候 sr里面存放的对象会被系统的垃圾回收器回收,sr.get()==null;
如果一个ListView里面有很多条目
分批的方式,或者分页的方式加载数据
一次从服务器上加载5条数目信息,当用户拖动界面到最下面的时候,加载更多的数据信息
1.给listView注册一个滚动的监听事件。
2.当用户把listView滚动到界面的最下面的时候,得到当前最后一个条目的position
3.根据这个position获取position~position+5的数据。
4.通知listview更新显示的数据内容
1 1.//给listview设置一个滚动的监听事件 2 list.setOnScrollListener(new OnScrollListener(){ 3 /** 4 静止~滚动 5 滚动~静止 6 */ 7 public void onScrollStateChanged(AbsListView view,int scrollState){ 8 9 if(isloading)//在加载数据的过程中 不再相应listview的拖动事件,防止加载错误的信息,防止加载错误的id 10 return; 11 12 13 if(scrollState==OnScrollListener.SCROLL_STATE_IDLE){ 14 //如果listview里面最后一个可见的条目的id 等于当前listview里面元素的个数大小 15 //如果listview被拖动到了界面的最后一个条目 16 int lastPostion=list.getLastVisiblePosition();//从0开始 17 int size=books.size();//listview里面有多少个条目 18 if(lastPostion==(size-1)){ 19 //代表最后一个可见的条目是listview的最后一个条目 20 //加载更多的内容 21 startPostion+=count; 22 //加载从startposition开始的数据 23 fillData(); 24 } 25 26 } 27 28 } 29 public void onScroll(AbsListView view,int firstVisibleItem,int visibleItemCount,int totalItemCount){ 30 31 32 33 } 34 35 }); 36 37 38 39 40 41 //ListView的懒加载 42 43 //连接服务器下载图片到本地,缓存图片到本地sd卡上 44 Bitmap bitmap=BitmapFactory.decodeFile("/sdcard/a.jpg");//这个方法如果图片比较大 100k 150ms 45 bitmap.compress(CompressFormat.JPEG,20,outputStream); 46 47 //在SD卡上保存的有图片的原图,图片的缩略图 48 49 /** 50 当为了避免listview拖动的时候有卡顿的现象出现,在listview滚动的时候显示图片的缩略图 51 */ 52 case OnScrollListener.SCROLL_STATE_IDLE: 53 scrolling=false; 54 int position=lv.getFirstVisiblePosition(); 55 //获取listview里面的某个孩子的view对象lv.getChildAt(index); 56 int count=lv.getChildCount(); 57 for(int i=0;i<count;i++){ 58 TextView tv=(TextView)lv.getChildAt(i); 59 int realpostion=position+i; 60 tv.setText("加载"+realpostion+"原图"); 61 }
解决listview的快速拖动的问题
当listview在滚动状态下,不去加载listview里面真是的图片和内容,而是把一个缩略图加载界面上
当listview的滚动状态停止的时候 采取真正的更新里面的条目的内容
listview 属性
1 android:fastScrollEnabled="true" //如果listview有很多条目,在listview的右边会显示出来一个快速滚动的进度条 2 android:scrollbarstyle=""//设置滚动条的位置 3 scrollbars="none" //隐藏掉滚动条目 4 5 lv.addHeaderView(v);//在listview上面增加一个view 6 lv.addFooterView();//在listview尾部增加一个view
如果要在滚动的时候在中间显示东西
那么就注册onScrollListener 在onScroll事件中进行处理
1 //listview滚动的时候 调用的方法 2 private WindowManager wm; 3 4 wm=getWindowManager(); 5 6 7 onScroll(){ 8 9 if(tv_index=null){ 10 tv_index=new TextView(this); 11 tv_index.setText((String)lv.ItemAtPosition(firstVisibleItem)); 12 //这里的写法具体的查看豆瓣的第3天 视频19 code为listviewdemo 13 wm.addView(tv_index,params); 14 } 15 }
关于listview的优化:
1. listview的界面的优化:
1 android:divider="@android:color/transparent" listview条目与条目之间的间隙的分割内容 2 android:paddingTop="5.0dip" listview条目之间的间隙 3 android:listSelector="@color/transparent" listview点中的颜色变化 4 android:fastScrollEnabled="true" 如果listview有很多个条目 ,在listview的右边 会显示出来一个快速滚动的进度条 5 (listview里面的条目至少要滚动5个屏幕以上) 6 android:scrollbarStyle="outsideOverlay" 7 android:scrollbars="none" 8 footer view 9 header view 10 快速拖动时候的悬浮提示(window manager) 11 12 13 新浪微博的 那个下拉更新是怎么做的啊 14 listview的下啦更新. 15 1. 设置listview的headerview 显示 向下拖动 更新的(默认的 显示是隐藏的) 16 17 18 19 20 2. listview数据显示的优化. 21 复用历史缓存的view对象, convertView 减少 采用布局填充器服务 填充布局的次数,达到减少xml->view 操作的次数. 22 定义了静态的viewholder 储存了 view对象里面控件的引用, view.setTag() view.getTag(); 减少遍历view对象 树状结构的次数. 23 采用了内存缓存 缓存一些经常使用的数据 24 服务器上的图片,缓存这些图片,(缓存手机的内存卡,sd卡)利用softreference把图片给缓存到内存里面 25 listview的分页显示 26 //服务器需要提供接口, 一次获取一段的数据. 27 //数据库提供接口 ,一次查询一段的数据. 28 listview的延时加载 29 //如果listview里面要显示的有很多的数据, 我们不需要一次把所有的数据都获取出来. 30 //分段的方式 一段一段的把数据下载下来. 31 注册listview的 onScrollListener(); 发现最后一个可见的条目 为listview里面数据适配器里面的最后的一个条目, 加载更多的内容.
时间换空间: 内存不足,不能直接获取全部的数据,只能多花时间,一段一段的获取数据并显示
时间换时间: 开机优化, 开机的服务要启动,应用程序要启动加载.
如何优化android手机的启动速度, 如何优化android的虚拟机.
空间换空间: 大数据的交换和存储
空间换时间: 内存缓存 sd卡缓存 空间换时间.
解决listview的快速拖动的问题:
当listview在滚动状态下,不去加载listview里面真实的图片和内容,而是把一个缩略图加载界面上.
当listview的滚动状态停止的时候 才去真正的更新里面的条目的内容.