异步加载与缓存的重要性

来源:互联网 发布:iphone8降价趋势 知乎 编辑:程序博客网 时间:2024/06/05 17:52
   对于编写C/S(客户端/服务端)模式的Andorid应用程序来说,通常需要从服务端获取图片及其他数据信息,为了避免系统抛出应用程序无响应异常,切记不能在主线程中加载网络图片资源。通用的做法是开启一个新的线程进行网络操作,在获取网络图片之后,通过Handler机制把图片和UI控件进行关联。

        在加载网络图片的时候需要特别注意,相对于文本信息来说图片资源往往会消耗比较大的流量,对于应用来说,这确实是个比较敏感的问题,如果处理不好这个问题,会让用户感觉应用程序非常不友好。作为开发者,必须懂得替用户考虑这些细节问题。

        实际上,用户在使用应用的时候,可能会有很多重复性的操作,从而造成应用程序重复获取网络图片,通常情况下,同一地址的网络图片,即使在多次访问的时时候都是相同的,所以没有必要每次都去重新获取网络图片。所以可以把一部分图片信息存储在内存中,在需要显示的时候,直接从内存中直接获取。

        由于图片数据会占据非常大的内存空间,处理不当很容易发生OOM(系统内存不足)异常,这是一个让人很无奈的异常,只能尽量避免它却无法根除它,所以不能把所有的图片都保存在内存中。移动设备一般都会配有SDCard,因此可以在Sdcard中存储一些已经获取到的图片数据,然后对它进行管理,这样既能节约流量又能提高加载图片的效率。
        
        在Android应用程序中经常会出现ANRs (“Application Not Responding”)异常信息,这是由于主线程(UI线程)在5秒钟之内没有响应的话,Android系统会抛出应用程序无响应异常。主要原因是在主线程中处理了一些非常耗时的操作,比如网络操作、 I/O操作或者执行未优化的SQL语句。对于这个问题,在Android中可以通过异步的方式进行避免。方法就是启动一个新的线程来获取网络资源或进行一些耗时的操作,完成之后通过Handler机制发送消息给UI线程,在UI线程中处理消息。 

        Android FrameWork提供了一个AsyncTask类,它已经对Handler消息模型进行了封装和优化,通过它可以很轻松的实现异步操作。

        对于网络图片资源来说,不应该每次在应用需要显示的时候都重新到远程去下载,因为网络操作非常耗时而且耗费网络流量,但是又不可能把所有图片资源都放到内存中去,因为图片资源往往会占用很大的内存空间,容易导致OOM。对于这个问题,可以把一部分图片保存在内存里面,把另外一部分保存在SDcard上,然后采用一个LRU(最近最少使用)算法进行替换,能够保证只占用sdcard的一小部分空间,这样既保证了图片的加载速度又节省了流量、也不会占据太多的SDCard空间。

        还可以使用另外一种做法,把资源直接保存在内存中,然后设置过期时间和LRU(Least Recently Used,最近最少使用)规则,让Android系统根据引用类型来管理这些缓存数据。

原创粉丝点击