在开发ImageViewer这个应用的过程中,主要遇到了以下问题:
1,对android应用层的控件,ImageSwitcher和Gallery还不熟悉
2,在开发的工程中,因为Gallery空间加载sdcard图片的时候,一次加载了所有sdcard卡上的图片,从而导致了OOM(out of memory).
3, 在添加删除的过程中,由于对Gallery控件的不熟悉,一时间不知道,在删除一张图片之后,应该如何控制Gallery,让这张图片在Gallery中消失。
4,开发工程中,一度逻辑混乱,但是左右一一纠正。
对上述问题的回答:
1,关于android控件
可以理解,android 的应用层开发实际上就是UI,就是调用SDK中的API,来合理的堆砌android固有组建。对于这类开发,主要的逻辑就是,画什么,在哪里画,什么时候画的问题。
2,OOM
在应用中如果一次性加载很多张sdcard中的图片,那么内存不足,必然会出现OOM异常。解决方案是:在Gallery需要加载图片的时候,首先取查询ImageCache,这个Cache是对图片资源的一个缓存,用Hashtable来表示,Key是加载进来的图片的索引好,value就是这个图片的图片的对象。当需要加载的图片不在cache中的时候,才取解码保存一张图片资源。那么什么时候释放cache资源呢?根据Gallery控件的特性,任何一个时刻总有一张图片被选中,所以onItemSelected方法总有机会调用,那么在onItemSelected方法的最后取调用一个releaseBitmap来释放cache中的图片资源。那么有哪些图片资源是可以被释放的呢?我的代码里认为,凡是在Gallery控件不可见的范围呢的图片都是可以被释放的。关于,这你点,可以因地制宜。
3,Gallery的删除
这里又要提到的Gallery的特性,我不太清除到底Gallery是什么,但是我知道Gallery在使用的时候要绑定一个adapter,来做为Gallery和具体数据之间的桥梁,然后具体的数据,隐藏在adapter内,这里我的数据是一个ArrayList来指示图片的绝对路径,当删除一张图片的时候,数据源发生了变化,这个变化要让adapter感知到,就要调用方法adapter.notifydatasetchanged()方法,并且让Gallery重新设置adapter,gallery.setAdapter()。对于,我代码中的处理,我个人认为还存在一点效率上的问题。但是,大致思路,应该如此。
4,在应用开发的过程中,我一度逻辑混乱,对于一个应用开发者来说,这是非常可怕的,在此我提醒自己,在开发的过程中,一定要先想清楚再行动。