当前位置: 代码迷 >> Eclipse >> Eclipse rcp/rap 开发经验总结(14) -rap 图片、数据缓存处置
  详细解决方案

Eclipse rcp/rap 开发经验总结(14) -rap 图片、数据缓存处置

热度:502   发布时间:2016-04-23 12:41:33.0
Eclipse rcp/rap 开发经验总结(14) -rap 图片、数据缓存处理

一、概述

在进行了 rap 的基本学习之后,您对 rap 的理解是否进入了更高的一个层次呢,个人觉得,对学习 rap 的人来说,进行 rap 的学习是一个探索的过程,在编程中不断的对其进行理解和分析,下面就 rap 在实际应用中用到的一些知识做一总结,好了,别不多说,下面进入正题, rap 图片、数据缓存的处理。

二、缓存处理的原因

???? 可能你要问为什么要将这个图片、数据的缓存问题提到书面上来呢,作为一个编程人员来将,做缓存的处理不是每个程序员都应该知道的事情吗?但是,我要说正是这个大家觉得习以为常的东西就更要提到书面中来,做一警惕。

三、缓存图片的处理

1 、问题的发生

在我们开发的项目中,发现了这样一个现象,运行 rap 的项目,速度非常的慢,在我们工程的界面上左侧是一棵用 treeViewer 构建的树,树的数据量也不是很大,每个树节点上有图片的信息,打开这棵树的过程就需要 6 7 秒的时间。最后发现是每一个树上的节点的创建过程都重新加载了图片引起的。当把图片放入到了缓存中速度明显就提升上来了。具体的看看代码中是怎么的实现吧。

?

2 、图片缓存的处理

1) 、图片缓存类 ImageUtil ,处理图片从缓存中获取,如果缓存中没有该图片的信息,那么通过图片的路径将图片加载到缓存中来,在从缓存中获取图片的信息,这样就不用每次都加载图片,加载一次可复用多次。

?

Java代码 ?收藏代码
  1. import ?java.net.MalformedURLException;??
  2. import ?java.net.URL;??
  3. ??
  4. import ?org.apache.log4j.Logger;??
  5. import ?org.eclipse.jface.resource.ImageDescriptor;??
  6. import ?org.eclipse.jface.resource.ImageRegistry;??
  7. import ?org.eclipse.swt.graphics.Image;??
  8. ??
  9. /** ?
  10. ?*? ?
  11. ?*?图片工具类 ?
  12. ?*? ?
  13. ?*/ ??
  14. public ? class ?ImageUtil?{??
  15. ????private ? static ?Logger?log?=?Logger.getLogger(ImageUtil. class );??
  16. ????private ? static ?ImageRegistry?registry?=? new ?ImageRegistry();??
  17. ??????
  18. ????/** ?
  19. ?????*?获取图片 ?
  20. ?????*? ?
  21. ?????*?@param?fileName ?
  22. ?????*????????????图片的名称 ?
  23. ?????*?@return?先从缓存对象中查找,若有直接返回,若没有,则将图片加载到缓存中,在从缓存中将图片传给调用着 ?
  24. ?????*/ ??
  25. ????public ? static ?Image?getImage(String?fileName)?{??
  26. ????????Image?image?=?registry.get(fileName);??
  27. ????????if ?(image?==? null )?{??
  28. ????????????URL?folderURL?=?null ;??
  29. ????????????try ?{??
  30. ????????????????folderURL?=?new ?URL( "file:" ?+?PathUtil.getIconPath(fileName));??
  31. ????????????????image?=?ImageDescriptor.createFromURL(folderURL).createImage();??
  32. ????????????????registry.put(fileName,?ImageDescriptor.createFromURL(folderURL));??
  33. ????????????}??
  34. ????????????catch ?(MalformedURLException?e)?{??
  35. ????????????????log.error("getImage?error:" ,?e);??
  36. ????????????}??
  37. ????????}??
  38. ????????return ?image;??
  39. ????}??
  40. ?????
  41. }??

?

?

?

2) 、处理图片路径的类 PathUtil ,该类处理加载的图片的路径,根据一个图片的名称,寻找图片的路径。

?

Java代码 ?收藏代码
  1. import ?org.apache.log4j.Logger;??
  2. import ?org.eclipse.core.runtime.FileLocator;??
  3. import ?org.eclipse.core.runtime.Platform;??
  4. ??
  5. import ?telecomui.application.Activator;??
  6. ??
  7. /** ?
  8. ?*?路径工具类 ?
  9. ?*? ?
  10. ?*? ?
  11. ?*/ ??
  12. public ? class ?PathUtil??
  13. {??
  14. ????private ? static ?Logger?log?=?Logger.getLogger(PathUtil. class );??
  15. ??????
  16. ????/** ?
  17. ?????*?获得平台相对绝对路径 ?
  18. ?????*? ?
  19. ?????*?@param?pluginID ?
  20. ?????*?@return ?
  21. ?????*/ ??
  22. ????public ? static ?String?getRoot()?{??
  23. ????????String?path?=?null ;??
  24. ????????try ?{??
  25. ????????????path?=?FileLocator.toFileURL(Platform.getBundle(Activator.PLUGIN_ID).getEntry("" ))??
  26. ????????????????????.getPath();??
  27. ????????????path?=?path.substring(path.indexOf("/" )?+? 1 ,?path.length());??
  28. ????????}??
  29. ????????catch ?(Exception?e)?{??
  30. ????????????log.error("getRoot?method?:" ,?e);??
  31. ????????}??
  32. ????????return ?path;??
  33. ????}??
  34. ??????
  35. ????/** ?
  36. ?????*?获得icon目录下的文件路径 ?
  37. ?????*? ?
  38. ?????*?@param?fileName ?
  39. ?????*?@return?绝对路径 ?
  40. ?????*/ ??
  41. ????public ? static ?String?getIconPath(String?fileName)?{??
  42. ????????String?rootPath?=?getRoot();??
  43. ????????return ?rootPath??
  44. ???????????????+?"icons/" ?+?fileName;??
  45. ????}??
  46. }??

?

?

3 、用法

在用到图片的地方,调用工具类 ImageUtil 中的 getImage(fileName) 就可以了,其中参数 fileName 是图片的名称。此外需要注意下,所有图片是放到 icons 目录下的。具体的实现类在这就不列出代码了。

?

四、数据缓存的处理

数据缓存的原理很简单,就是将要加载的数据先存到一个位置,用的时候直接从这个位置中取出就可以了,不用每次用的时候都要创建连接数据库的信息并从数据库中读数据,若想要更新的数据,就要出现个刷新按钮了,刷新一下,从数据库中读出新数据更新缓存,用的时候还是从缓存中取数据信息。

下面说说我们项目中用到的数据缓存的实现原理。

因为我们项目中用到的数据基本上是组装树结构的数据,所以将数据以 list 的形式存放的。具体思路是:从数据库中查询出来的数据存放到 list 中,当项目中调用数据库数据的时候就是从这个 list 中取得,当刷新数据的时候在更新对应的 list 中的数据就可以了。

代码的实现也是很简单,这里就不粘代码了,简单介绍下实现方案。

定义一个缓存 list 存放数据,提供一个方法 a 将数据存放到这个 list 中来,并对外提供一个获得这个 list 的接口方法 b ,外界来调用这个接口方法 b 获得数据,当要刷新数据的时候就直接调用 a 方法。

  相关解决方案