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 с кастомным шрифтом, не кэшируя его, то сие дело может занять несколько секунд, что не очень понравится юзеру. А с кэшированием элементы будут созданы практически мгновенно.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *