为了解决网络加载数据缓慢提高用户体验,如何解决这个问题,有两种思路。
Pointillism最近发布的移动app,解决了那些边远地域[remote area]的用户使用游戏的问题。
一是预加载游戏可能会用到的所有内容。
要么将所有数据/图片与应用一同打包,要么强迫用户在启动App的时候立即下载相关数据。
另一种方法是部署某种形式的缓存策略
图片缓存超简单,Dan Florio (PolyGeek)写了个名为ImageGate的组件,实现了Image组件和缓存机制。这个组件很好上手,只要在你MXML或ActionScript中将<s:Image>替换为他的组件即可。这样一来,查看的图像就会被缓存。我将他的组件做了些调整,发在了我的Apache空间上。我将Image组件替换为BitmapImage,并在iOS设备上的适当位置增加了一个小补丁以支持图片缓存。
缓存数列难度不会提升太大。AIR有个内置的“写入磁盘”功能——SharedObjects。SharedObjects最初是作为替代浏览器中cookie的存在,而在AIR里帮助我们将变量长期存储。每当有数据从服务器返回,我变将它作为SharedObject存储起来。这是一个非常好的策略,允许我们即刻显示旧数据并在当下实时更新新数据。我们的数据的更改并没有那么频繁,最多可能就只是一天更新一次罢了。
选一个数据管理器的构造函数来看:
View Code
1 so = SharedObject.getLocal("org.pointi.cache"); 2 if (so.data.pointsList == null) 3 { 4 so.data.pointsList = new Array(); 5 so.flush(); 6 }
服务器返回数据时,进行:
View Code
1 so.data.pointsList[curHuntID] = event.result as ArrayCollection; 2 so.flush();
最后,当我们想读回数据,以下就是所有需要做的(pointsList是一变量,要发送到我们所要调用的组件):
View Code
1 ro.getPointList(huntID, userID); //call the remote function on the server 2 if (so.data.pointsList[huntID] != null) 3 { 4 pointsList = so.data.pointsList[huntID] as ArrayCollection; 5 }
对所有数列做类似的设置,我们就可以保持服务器与客户端同步。