你好,
我正在开发一个应用程序,其中用户指定一些图片以及它们将在屏幕上显示多长时间。所以有时他想要创建类似小动画的东西或者在很短的时间内查看图像。问题是,经过一段时间后,图像没有被预览,我们有几毫秒的错误。在我正在开发时间的应用程序很重要,所以我想帮助解决问题所在。
所以让我解释它是如何工作的。我从我的网络应用程序中获取图片,然后将它们保存在HashMap中
Bitmap image = ImageOperations(url,String.valueOf(frameNum) + ".jpg");
ImageMap.put(String.valueOf(frameNum), image);
其中mathod ImageOperations是这样的:
private Bitmap ImageOperations(String url, String saveFilename) {
try {
Display display = getWindowManager().getDefaultDisplay();
InputStream is = (InputStream) this.fetch(url);
Bitmap theImage = BitmapFactory.decodeStream(is);
if (theImage.getHeight() >= 700 || theImage.getWidth() >= 700) {
theImage = Bitmap.createScaledBitmap(theImage,
display.getWidth(), display.getHeight() - 140, true);
}
return theImage;
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
所以稍后我运行一个线程,在用户指定时更新UI。更新它的方法就是这个。
public void setPictures(int NumOfFrame) {
if (frameArray.get(NumOfFrame - 1).frame_pic.contains("n/a") != true) {
ImagePlace.setImageBitmap(ImageMap.get(String.valueOf(NumOfFrame)));
} else {
ImagePlace.setImageDrawable(null);
}
}
在我们更新图像之后,我们将线程置于睡眠状态,当再次运行时,它会更新线程。是否存在产生问题的内容?是否与垃圾收集有关?
提前谢谢
答案 0 :(得分:1)
问题可能是在加载其他图像时增加堆大小。我建议你做一些profiling,这样事情会更加清晰,你会全面了解应用程序的时间。
答案 1 :(得分:0)
首先,你在这里错过了一个空检查:
ImageMap.get(String.valueOf(NumOfFrame))
你不在这里回收旧的位图:
theImage.recycle(); // missing line
theImage = Bitmap.createScaledBitmap(theImage,
display.getWidth(), display.getHeight() - 140, true);
这可能会导致出现内存异常,最有可能来自您对问题的描述。
此外,我不确定BitmapFactory.decodeStream
失败时是否会抛出异常。您还需要在那里添加空点检查。