0

问题

你好呀,

我正在开发一个应用程序,用户在其中指定一些图片以及它们将在屏幕上显示多长时间。所以有时他想创建一个小动画之类的东西或在一小段时间内查看图像。问题是一段时间后,图像没有在应该预览的时候进行预览,并且我们有几毫秒的错误。在我正在开发的应用程序中,时间很重要,所以我想要一些关于问题可能是什么的帮助。

编码

所以让我解释一下它是如何工作的。我从我的网络应用程序中拍摄照片,然后将它们保存在 HashMap 中

Bitmap image = ImageOperations(url,String.valueOf(frameNum) + ".jpg");

ImageMap.put(String.valueOf(frameNum), image);

其中的方法 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);
}

}

更新图像后,我们将线程置于睡眠状态,当再次运行时,它会更新线程。是否有什么造成问题的原因?它与垃圾收集有关吗?

先感谢您

4

2 回答 2

1

问题可能在于加载其他图像时增加堆大小。我建议您进行一些分析,这样事情会更加清晰,您将全面了解应用程序的时间安排。

于 2012-10-28T10:06:33.097 回答
0

首先,您在这里缺少一个空检查:

ImageMap.get(String.valueOf(NumOfFrame))

而且您不会在这里回收旧位图:

theImage.recycle(); // missing line
theImage = Bitmap.createScaledBitmap(theImage,
                        display.getWidth(), display.getHeight() - 140, true);

它可能会导致内存不足异常,这很可能来自您对问题的描述。

我也不确定BitmapFactory.decodeStream当他失败时是否抛出异常。您还需要在那里添加一个空点检查。

于 2012-10-28T09:43:58.603 回答