查看:1692|回复:0
JavaME将单例模式应用于缓存机制中的案例分析发表时间:2013-01-06 13:32:23

洗心、革面。

0分享0主题0帖子

学徒一级

(初出茅庐)

   如何解决JavaME 中绘制本地图片的频繁,同一图片不同地方绘制,每次都要装载图片,每次都要新建对象的问题。

   解决方案:
   缓存应用:加载程序时,将所有有可能要绘的本地图片全部预装载到缓存,需要绘制的时候直接从缓存中读取.由于缓存器被设置为登记式缓存,即使以后有新图片加入本地资源,也无须更改原有代码,直接在新增功能程序里调用缓存即可。

   具体实现:采用单例的设计模式来实现缓存应用。缓存控制器整个系统中只需要一个即可。

   源代码:
   ImageBean.java(封装下载的图片的 Javabean)

package com.xxx.bean;

public class ImageBean
{
   //------------------------------------------------------
   //fields.
   
   /**
    *     地图图片的横坐标.
    */
   private int abscissa;
   
   /**
    *     地图图片的纵坐标.
    */
   private int ordinate;
   
   /**
    *     要下载地图的 http url 链接地址.
    */
   private String url;
   
   /**
    *     下载的图片的字节流.
    */
   private byte[] byteOfImage;
   //--------------------------------------------------------------------
   //The getters and setters.
   
   public int getAbscissa()
   {
       return abscissa;
   }
   public void setAbscissa(int abscissa)
   {
       this.abscissa = abscissa;
   }
   public int getOrdinate()
   {
       return ordinate;
   }
   public void setOrdinate(int ordinate)
   {
       this.ordinate = ordinate;
   }
   public String getUrl()
   {
       return url;
   }
   public void setUrl(String url)
   {
       this.url = url;
   }
   public byte[] getByteOfImage()
   {
       return byteOfImage;
   }
   public void setByteOfImage(byte[] byteOfImage)
   {
       this.byteOfImage = byteOfImage;
   }
   
}

 ImageManager.java(单例类负责所有本地图片的管理工作 [缓存器的管理类])


package com.xxx.util;
import java.io.IOException;
import java.util.Hashtable;
import javax.microedition.lcdui.Image;
/**
*
* 项目名称:Basic1.0
* 类名称:ImageManager
* 类描述:单例类负责所有本地图片的管理工作 [缓存器的管理类]
* 创建人:Defonds
* 创建时间:2009-10-28 上午11:32:43
* 修改人:Defonds
* 修改时间:2009-10-28 上午11:32:43
* 修改备注:
* @version
*
*/
public class ImageManager
{
   /**
    * 缓存器.专门用来存放程序中用到的图片.
    */
   private static Hashtable imageCache = null;
   
   /**
    * 饿汉式单例模式,类加载器加载时就有了本类的一个实例,提高了系统效率.
    */
   private static ImageManager instance = new ImageManager();
   /**
    * 私有的构造子,防止被任意调用,保证本类在整个项目中只能有一个实例.
    */
   private ImageManager()
   {
       imageCache = new Hashtable();
   }
   /**
    * 这里提供了一个供外部调用本 class 的静态方法,可以直接访问
    */
   public static ImageManager getInstance()
   {
       return instance;
   }
   /**
    * 登记式缓存器的应用.
    * 如果图片是第一次访问本方法,产生一个实例并返回.同时将此实例加载到缓存器之中
    * 如果图片是第2,3,,,n次访问本方法,直接返回该图片实例,大大提高了系统运行效率
    */
   public Image getImage(String name)
   {
       Image image = null;
       try
       {
           System.out.println("111111111111111");
           if (null == imageCache.get(name))
           {
               System.out.println("222222222222222");
               image = Image.createImage("/" + name + ".png");
               System.out.println("33333333333333333333");
               imageCache.put(name, image);
           }else
           {
               image = (Image)imageCache.get(name);
           }
       }catch (IOException ioe)
       {
           ioe.printStackTrace();
       }
       
       return image;
   }
   
   /**
    * 批量将一个数组中所有的图片放入缓存器[一般是在 MIDlet 中对缓存器初始化时使用
    */
   public  void loadImagesCache(String[] names)
   {
       for (int i = 0; i < names.length; i++)
       {
           try
           {
               if (names[i] != null)
               {
                   imageCache.put(names[i], Image.createImage("/" + names[i] + ".png"));
               }
           }catch (IOException ioe)
           {
               ioe.printStackTrace();
           }
       }
   }
}

客户端使用缓存示例:

   ImageManager imageManager = ImageManager.getInstance();
   Image image = imageManager.getImage("logo");

您需要登录以后才可以回帖    登录|注册