У меня довольно много проблем с памятью в моем приложении. Я думаю, что мои растровые изображения отсортированы, моя текущая проблема, похоже, связана с 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();
}
Сохранение StringBuilder как переменной класса означает, что его внутренний буфер остается выделенным для жизни класса. Если вам не нужны данные символов как StringBuilder и String, вы должны создать новый StringBuilder в качестве локальной переменной внутри formatContent() при каждом вызове. В качестве альтернативы, если вы можете обойтись с CharSequence вместо String и просто использовать StringBuilder вместо создания String. (Это не сработает, конечно, если вы должны в конечном итоге передать его API за пределами вашего контроля, для которого требуется String.)