输入流和时间显示的廉价强大建筑/格式?

时间:2011-01-17 21:35:08

标签: android memory-management string-formatting

我的应用程序存在大量内存问题。我想我的位图已经整理好了,我目前的问题似乎源于Strings。我有两个经常发生的功能,需要确保它们是可靠的。

首先是将输入流转换为字符串。

第二个是在媒体播放器中格式化计时器显示。这种情况每秒都会发生

这些功能是否存在明显的低效问题?感谢

**编辑,快速编辑了maketimestring,因为我发现了一个显而易见的缺点,我每次都在从资源中提取字符串。

    private static StringBuilder sBuilder = new StringBuilder();
    private static Formatter sFormatter = new Formatter(sBuilder, Locale.getDefault());
    private static final Object[] sTimeArgs = new Object[5];

    public static String makeTimeString(String durationFormat, long secs) {
        sBuilder.setLength(0);
        final Object[] timeArgs = sTimeArgs;
        timeArgs[0] = secs / 3600;
        timeArgs[1] = secs / 60;
        timeArgs[2] = (secs / 60) % 60;
        timeArgs[3] = secs;
        timeArgs[4] = secs % 60;
        return sFormatter.format(durationformat, timeArgs).toString();
    }

    public static String formatContent(InputStream is) throws IOException {
        if (is == null) 
            return "";

        sBuilder.setLength(0);
        BufferedReader buffer = new BufferedReader(new InputStreamReader(is));
        String line = null;
        while ((line = buffer.readLine()) != null) {
            sBuilder.append(line).append("\n");
        }
        buffer.close();
        buffer = null;

        return sBuilder.toString().trim();
    }

1 个答案:

答案 0 :(得分:0)

将StringBuilder保持为类变量意味着其内部缓冲区在类的生命周期内保持分配状态。除非你需要将字符数据作为StringBuilder和String,否则每次调用时都应该在formatContent()内部创建一个新的StringBuilder作为局部变量。或者,如果您可以使用CharSequence而不是String,并且只使用StringBuilder而不是构造String。 (当然,如果您必须将其传递给控件之外的需要String的API,那么这不起作用。)