我必须在Button中显示大约100个图标(每个50x50)。我正在下载包含所有100个图标的大png图像,然后使用Image.subImage()
方法创建每个图标。
但我的申请获得OutOfMemoryError
。
我正在考虑解决这个问题:
哪种解决方案最好?或者你有任何其他解决方案来解决这个问题。
答案 0 :(得分:2)
LWUIT专为小型设备而设计,因此您应该设计代码。所以一个大的形象不是一个好主意。
你应该使用单独的图像。并且只保留那些你能看到的记忆。或者你将继续遇到内存错误。
我会像这样处理它。 获取缓存地图。 如果你想要一个图像,检查它是否已经在缓存图中。 如果是,请使用cachemap中的图像 如果没有下载它并将图像放在缓存图中。 当你内存不足时,从cachemap中删除最后一张图片并下载新的。
if (imageCache.get(url) != null) {
//#debug
System.out.println("Get cached image from: " + url);
asyncImage.setImage((Image) imageCache.get(url));
asyncImage.setQueued(false);
} else {
//#debug
System.out.println("Start download image from:" + url);
map.put(url, asyncImage);
ImageDownloadService d = new ImageDownloadService(url, new ActionListener() {
public void actionPerformed(ActionEvent evt) {
NetworkEvent n = (NetworkEvent) evt;
Image image = (Image) n.getMetaData();
String url = n.getConnectionRequest().getUrl();
AsyncImage asyncImage = (AsyncImage) ImageManager.this.map.get(url);
map.put(url, asyncImage);
asyncImage.setImage(image);
map.remove(url);
imageCache.put(url, asyncImage.getImage());
asyncImage.setQueued(false);
if (Display.getInstance().getCurrent() instanceof AsyncLoadable) {
((AsyncLoadable) Display.getInstance().getCurrent()).asyncLoaded();
} else {
Display.getInstance().getCurrent().repaint();
}
//#debug
System.out.println("Retrieved image from:" + url);
}
});
d.addResponseCodeListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
NetworkEvent n = (NetworkEvent) evt;
String url = n.getConnectionRequest().getUrl();
AsyncImage asyncImage = (AsyncImage) ImageManager.this.map.get(url);
asyncImage.setQueued(false);
map.remove(n.getConnectionRequest().getUrl());
//#debug
System.out.println("Failed image from:" + url);
}
});
NetworkManager.getInstance().addToQueue(d);