приложение «очищается от кэша шрифтов» и в конечном итоге падает из-за нехватки памяти, Android - PullRequest
1 голос
/ 09 марта 2011

Я в самом начале создания приложения (которое еще ничего не делает, но отображает некоторые кнопки), и когда я запускаю его, я получаю сообщение об ошибке в logcat: «очищение 193K из кэша шрифтов [23 записи] "снова и снова, пока примерно через минуту приложение не падает из-за нехватки памяти.Мои 3 кнопки - это пользовательские кнопки, использующие собственный шрифт.Возможно, проблема со шрифтом?

Ответы [ 2 ]

6 голосов
/ 03 декабря 2012

Проблема в вызове Typeface.createFromAsset ().

Я уменьшил это создание фабрики шрифтов, поэтому он вызывает Typeface.createFromAsset () один раз для каждого типа шрифта.

Фабрика шрифтов содержит шрифт в hashmap, и это делает свое дело.

Я нашел решение по этой ссылке и немного подправил:

http://www.levinotik.com/2011/09/22/custom-fonts-in-android-can-cause-issues-heres-how-to-fix-it/

Вот как я это реализовал.

public class FontFactory {
    private static FontFactory instance = new FontFactory();
    private HashMap<String, Typeface> fontMap = new HashMap<String, Typeface>();

    private FontFactory() {
    }

    public static FontFactory getInstance() {
        return instance;
    }

    public Typeface getFont(String font) {
        Typeface typeface = fontMap.get(font);
        if (typeface == null) {
            typeface = Typeface.createFromAsset(MyApplication.getApplicationContext().getResources().getAssets(), "fonts/" + font);
            fontMap.put(font, typeface);
        }
        return typeface;
    }
}
0 голосов
/ 27 июня 2011

Мне удалось значительно сократить это сообщение skia (и возможное состояние нехватки памяти), объявив гарнитуру статической в ​​классе активности.

т.е.

public class myActivity extends Activity
{
    //font
    private static Typeface mFontHelvet;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mylayout);

        if (mFontHelvet == null)
        {
            mFontHelvet = Typeface.createFromAsset(this.getAssets(), "Helvetica.TTF");
        }

        myTextView = (TextView) findViewById(R.id.mytextview);
        myTextView.setTypeface(mFontHelvet);
        myTextView.setText("blah blah");
    }
}

это может показаться рискованным, но, по крайней мере, пользователь может переходить между двумя моими действиями, не входя в состояние нехватки памяти!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...