`

Eclipse中如何管理图像资源

    博客分类:
  • SWT
阅读更多
Eclipse中最为人所垢病的莫过于它的SWT,特别是对于那些习惯使用Swing开发界面的程序员而言,SWT除了在速度上优于Swing,扩展性,灵活性,都远逊于Swing,特别是已经习惯于JVM代为管理资源的程序员,在面对SWT中的各种需要手工Dispose的资源,难免头大,虽然SWT对于Component一级的资源释放控制的很好,当父控件被Dispose,所有的子控件都会被释放,已经大大减少了内存泄露的机率,但对于Color,Image,以及Font,SWT并没有提供好的管理方式,特别是应用最为广泛的Image,很多时候它会带来麻烦,甚至让整个系统crash。
接下来的内容,会详细的描述如何管理Image资源,包括它的创建,销毁,以及相应的责任人。
在SWT中,Image有三个最重要的类,分别是:
org.eclipse.swt.graphics.Image
org.eclipse.swt.graphics.ImageData
org.eclipse.jface.resource.ImageDescriptor
其中清白的是ImageData和ImageDescriptor,前者就是一个比较纯粹的数据模型,描述了每张图片上某一个点的颜色等基本图形信息,而后者则扮演了一个创建工厂的角色,可以创建Image。
最让开发人员头疼的资源管理其实集中在Image类中,它会持有操作系统UI的句柄,如果过多的使用而不翻译,就会造成当前系统的句柄不足,从而出错。如果你不幸的看到org.eclipse.swt.SWTError: No more handles 这样一个异常,那么Image就是造成这一切的元凶。但Image只是一把锋利的刀,用得不好,其实还是我们程序员的过错,下面先给出应用Image和ImageDescriptor的场景。
在SWT中有一个基本的原则,谁创建资源谁释放资源。那么就是说谁创建了Image,那么谁就应该负责释放资源。但是许多程序员并不很清楚这一原则,以如下两个场景为例:
 
场景一(通过LabelProvider为Tree提供Image)
private ImageDescriptor myImageDescriptor=.....;
    public Image getImage(Object element) {
        returnmyImageDescriptor.createImage();
    }
 
请注意上面的代码,在使用myImageDescriptor.createImage()创建了一个Image以后,这个Image作为返回值,交给了TreeViewer,它再也没有回来,也就是说你给出了Image,但没有持有它,这样自然就无法销毁它,当这个方法被调用几百或者上千次的时候,就会因为原先多次创建的Image占用了大量的Handle,从而无法再得到新的Hanlde,最终导致org.eclipse.swt.SWTError: No more handles异常的抛出。
 
因此,要区分场景来应用Image和ImageDescriptor.,前者如果是开发人员自己创建的,就一定要持有它,并在合适的时候销毁它。如果是ImageDescriptor,就可以放心的交给第三方处理。
但如果经常的销毁Image,也会带来一定的性能损失,所以在Eclipse中,经常使用ImageRegistry来缓存图片。
为了更好的帮助开发人员使用Image和ImageDescriptor,在UI框架中提供了一个PooledImageDescriptor,它扮演与ImageRegistry相近的角色,
它同样是继承了ImageDescriptor,但它与常用的ImageDescriptor有一个区别,就是它在createImage方法中,其实每次都是使用相同的Image,这样就减少了资源泄露的可能性。但是请注意,由于它只持有一个有效的Image,所以在需要ImageDescriptor的场所,不要直接使用PooledImageDescriptor,而是通过getImageDescriptor方法取得新的ImageDescriptor来使用,这是因为象Action之类的对象,会使用ImageDescriptor来createImage,再自行销毁,如果有A,B两个Action同时使用一个PooledImageDescriptor,然后各自使用PooledImageDescriptor创建了相应的Image,因为PooledImageDescriptor只有一个Image,所以这两个Action是共享一个Image,如果A先dispose了这个Image,那么B再使用这个Image就会出现问题。
所以对于PooledImageDescriptor的使用原则如下:
如果你需要Image,就直接使用PooledImageDescriptor的createImage,由它替你缓存Image。
如果你需要ImageDescriptor,请使用PooledImageDescriptor的getImageDescriptor,而不是直接将PooledImageDescriptor传递给第三方。
分享到:
评论

相关推荐

    eclipse资源文件编辑器插件

    Eclipse资源文件编辑器插件是开发者们在使用Eclipse集成开发环境时,为了提高工作效率,专门用于管理和编辑项目中的各种资源文件的工具。这款插件不仅能够帮助开发者们节省时间,还能提升他们在处理资源文件时的便利...

    资源文件编辑器(eclipse插件)

    在Eclipse中,这些资源可能包括文本文件、图像、配置文件、XML布局等,广泛应用于Java、Android以及其他支持的开发语言项目。 首先,资源文件编辑器的界面通常具有清晰的文件树视图,展示项目结构。用户可以通过这...

    Eclipse格式模板XML文件及图片使用

    虽然主要讨论的是格式模板,但了解如何管理和使用Eclipse中的图像资源也是重要的。图片可以用于界面设计,如自定义图标,或者在帮助文档中提供视觉辅助。 在实际应用中,Eclipse的代码格式模板XML文件可以通过以下...

    Eclipse ME 中文文档

    9. **资源管理**:在Eclipse ME中,开发者可以方便地管理应用的图像、音频和其他资源文件,同时进行版本控制和协作。 10. **国际化和本地化**:Eclipse ME提供了支持多语言应用开发的工具,使得开发者可以轻松实现...

    Android开发工具eclipse

    - 将SDK Manager与Eclipse集成,通常是在Eclipse中安装ADT插件后,通过插件配置指向SDK的路径,这样Eclipse就可以识别并管理Android项目。 2. **创建Android项目** - 在Eclipse中,使用"New -> Android Project...

    Eclipse下SWT图形界面开发指南(2)

    特别是JFace图像注册表的应用,让我们学会了如何高效地管理和利用图像资源,这对大型应用程序来说尤为重要。此外,排序和过滤功能的实现也进一步增强了应用程序的功能性和实用性。 #### 参考资源 - [Part 1 of ...

    Eclipse Rcp comon Navigator demo

    Common Navigator是Eclipse RCP中的一个重要组件,它提供了一种通用的资源浏览和管理界面。在本"Common Navigator demo"中,我们将深入探讨如何利用Eclipse RCP创建一个基于Common Navigator的简单应用,并了解如何...

    WindowBuilder for eclipse 3.8离线版

    5. `images`目录:存储了插件相关的图标和其他图像资源。 6. `plugins`目录:这是Eclipse插件的核心部分,包含了WindowBuilder的所有功能组件和依赖库。 7. `web`目录:可能包含了额外的Web资源,如帮助文档或者在线...

    eclipse插件eclipseme_1.7.7

    6. **资源管理**:对于J2ME应用中常见的图像、音频等资源,EclipseME 提供了方便的管理界面,使得资源的添加、修改和组织更加直观。 在提供的文件"eclipseme.feature_1.7.7_site[1]"中,"feature"通常指的是Eclipse...

    eclipse3.3 and 3.4中文包+BIRT中文教程

    1. **改进的插件管理系统**:Europa集成了多个独立的Eclipse平台,使得开发者可以更方便地安装和管理插件。 2. **资源比较和合并**:提供了更强大的文件和项目比较工具,便于代码冲突解决。 3. **工作流支持**:加强...

    eclipse 网格开发教程

    Eclipse 网格开发主要涉及到的是Eclipse集成开发环境(IDE)与网格计算技术的结合,这使得开发者能够利用网格资源进行大规模、分布式应用的构建和管理。网格计算是一种将互联网、企业内部网、高性能计算集群等不同...

    eclipse的activiti插件

    **Eclipse的Activiti插件**是用于在Eclipse集成开发环境中进行流程建模和管理的强大工具。Activiti是一款开源的工作流和业务自动化引擎,它提供了丰富的API和配置选项,使得开发者可以轻松地将工作流集成到Java应用...

    Eclipse的SublimeText2配色

    "theme-SublimeText2_for_eclipse.png"是一个图像文件,很可能是展示了该配色方案在Eclipse中的实际效果,帮助用户在应用前预览界面风格。这种预览有助于用户决定是否喜欢这种配色,或者需要进行哪些调整。 "用法....

    Eclipse 手机开发插件

    7. **资源管理**:管理图像、音频和其他资源文件,简化资源在不同设备间的适配。 对于初学者,压缩包内提供的配置教程是十分宝贵的资源,它会指导用户如何正确安装和配置EclipseME插件,以及如何设置Eclipse IDE以...

    Eclipse源代码分析部分

    - `getSharedImages()`:提供工作台的共享图像资源。 - `getWorkingSetManager()`:管理用户自定义的工作集,便于组织和筛选项目。 此外,`IWorkbench`接口还提供了创建、打开和切换透视图、保存所有编辑器、获取和...

    Eclipse RCP培训.zip

    Eclipse Rich Client Platform(RCP)是Eclipse框架下的一个核心组成部分,用于构建桌面应用..."Eclipse RCP培训.zip"中的内容可能涵盖了这些方面,包括理论讲解、代码示例、练习项目等,是学习Eclipse RCP的好资源。

    eclipse-swing-gui

    6. **资源管理**:管理图像和其他资源文件,方便它们与Swing组件关联和引用。 在使用此插件前,确保你的Eclipse环境已经配置好Java开发环境,因为Swing是基于Java的。同时,安装插件后,需要重启Eclipse以使新安装...

    eclipse-rcp开发培训PPT

    2. **资源管理**:利用Eclipse的资源管理功能,如Preference Service,实现用户配置的保存和恢复。 3. **国际化与本地化**:通过Eclipse的国际化支持,提供多语言版本的应用,满足不同地区用户的需求。 4. **性能...

    eclipse 可以实现java视图

    8. **资源管理**:Eclipse的项目管理功能可以方便地组织和管理资源文件,包括图像、字体等与视图相关的素材,确保它们能正确地被引用到程序中。 9. **版本控制系统**:Eclipse集成了多种版本控制系统,如Git,可以...

Global site tag (gtag.js) - Google Analytics