Дешевое построение / форматирование строк для входных потоков и таймеров?

1

У меня довольно много проблем с памятью в моем приложении. Я думаю, что мои растровые изображения отсортированы, моя текущая проблема, похоже, связана с Strings. У меня есть две функции, которые часто бывают и нужно убедиться, что они твердые.

Сначала преобразуется входной поток в строку.

Вторым является форматирование отображения таймера, как в медиаплеере. Это происходит каждую секунду.

Есть ли очевидная неэффективность этих функций? Благодаря

** edit, быстро отредактировал 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();
    }
  • 0
    Возможно, вам лучше использовать библиотеку, например joda time, в laset для первой. Предположительно он будет оптимизирован.
Теги:
memory-management
string-formatting

1 ответ

0
Лучший ответ

Сохранение StringBuilder как переменной класса означает, что его внутренний буфер остается выделенным для жизни класса. Если вам не нужны данные символов как StringBuilder и String, вы должны создать новый StringBuilder в качестве локальной переменной внутри formatContent() при каждом вызове. В качестве альтернативы, если вы можете обойтись с CharSequence вместо String и просто использовать StringBuilder вместо создания String. (Это не сработает, конечно, если вы должны в конечном итоге передать его API за пределами вашего контроля, для которого требуется String.)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню