Android: использование кастомных шрифтов и возможные проблемы с утечками памяти

Довольно часто есть необходимость в кастомизации стандартных элементов. Как пример, хотите использовать шрифты отличные от стандартных. О возможных проблемах при работе с шрифтами под Android и хочу рассказать.

Во-первых, посмотрим как можно подключить свой шрифт, если он лежит в assets/fonts директории:

Typeface tf = Typeface.createFromAsset(ctx.getAssets(), "fonts/myfont"); 
setTypeface(tf);

Вроде всё просто. Вот только, если у вас элементов около 200 (скажем, в списке ListView), то для каждого будет создан экземпляр Typeface. Как пишут, могут возникнуть утечки памяти на устройствах с Froyo (и некоторых других). Поэтому, предлагают кэшировать уже созданные экземпляры шрифтов.

Выглядеть это будет так:

public class Typefaces {

	private static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>();

	public static Typeface get(Context c, String name) { 
		synchronized (cache) {
			if (!cache.containsKey(name)) { 
				String path = "fonts/"+name;
				try {
					Typeface t = Typeface.createFromAsset(c.getAssets(), path);
					cache.put(name, t);
				} catch (Exception e) {
					e.printStackTrace();
				}

			}
			return cache.get(name);
		}
	}

}

Использовать так:

Typeface tf = Typefaces.get(getContext(), "MyFont"); 
setTypeface(tf);

Теперь утечки памяти не страшны. К тому же, работать такой код будет быстрее. Если вы попробуете создать одновременно 100-200 TextView с кастомным шрифтом, не кэшируя его, то сие дело может занять несколько секунд, что не очень понравится юзеру. А с кэшированием элементы будут созданы практически мгновенно.