5

Для того, чтобы обеспечить пользовательский шрифт в моем ListActivity, я написал класс CustomAdapter расширения BaseAdapter согласно этому примеру here.Медленный переход деятельности: несколько «инициализация раздувать состояние» в LogCat

Однако, как описано здесь, я написал метод getView() как следующее:

public View getView(int position, View convertView, ViewGroup parent){ 
    String gameName = gameNames[position]; // gameName ist the String[] of the Custom Adapter 

    TextView tv = new TextView(context); 
    tv.setText(gameName); 
    tv.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/gulim.ttf")); 

    return tv; 
} 

Это работает как задумано. Единственное, что беспокоит то, что это занимает около трех или четырех секунд, пока не появится список (и это очень долгое время в этом контексте). Однако в ListActivity я поставил onItemClickListener сек, как это:

private void setOnItemClickListener(){ 
    getListView().setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, int pos, long id){ 
      onClickEntryButton(((TextView) view).getText().toString()); 
     } 
    }); 
} 

private void onClickEntryButton(String gameName){ 
    Intent intent = new Intent(this, GameActivity.class); 
    intent.putExtra("gameName", gameName); 
    startActivity(intent); 
    finish(); 
} 

Теперь при нажатии на ListItem, она занимает еще больше времени, пока GameActivity не откроется. Это Activity - это всего лишь пара TextView s, заполненная информацией, взятой из базы данных SQLite. Также здесь я устанавливаю пользовательский шрифт для каждого TextView. Случается даже, что экран становится черным в течение 2-3 секунд (появляется приложение разбилось), затем появляется новый Activity. Этого не происходит, обращаясь к этому Activity из других мест приложения.

В обоих случаях - доступ к ListActivity и перейдя на GameActivity из ListActivity - пара

"szipinf - Инициализация раздувать состояние"

сообщения появляются в LogCat. Что они означают в этом контексте? Было бы лучше использовать onItemClickListener s в методе getView() моего CustomAdapter? Кажется, что-то действительно блокирует переходы, но я не могу понять, что, поскольку нет ничего большого, чтобы быть рассчитанным или обработанным (на самом деле, в базе данных SQLite есть ровно две записи с каждыми 5 полями)?

EDIT При необходимости или желании, конечно, я могу предоставить больше кода.

ответ

3

У меня была точно такая же проблема, и ваш вопрос дал мне ответ!

Я до сих пор не знаю точной причины, но это isuue из-за чтения пользовательского шрифта из активов несколько раз в моем случае. Если у меня есть 10 виджетов на моем экране, и каждый из них использует пользовательский шрифт, Android загружает его из активов каждый раз. который не только заставлял мои транзакционные переходы становиться медленными, но также приводил к сбою после игры с несколькими tmes.

Итак, я создал кэш для своего шрифта, чтобы избежать получения шрифта каждый раз из активов.

Я добавил этот код в моей полезности класса:

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

public static final String ASSET_PATH="assetPath"; 

public static Typeface getFont(Context c, String assetPath) { 
    synchronized (cache) { 
     if (!cache.containsKey(assetPath)) { 
      try { 
       Typeface t =(Typeface.createFromAsset(c.getAssets(), 
         "fonts/arial.ttf")); 
       cache.put(assetPath, t); 
      } catch (Exception e) { 
       return null; 
      } 
     } 
     return cache.get(assetPath); 
    } 
} 

Я создал свой собственный класс в setTypeface

public class MyButton extends Button { 

public MyButton(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

public MyButton(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public MyButton(Context context) { 
    super(context); 
} 

@Override 
public void setTypeface(Typeface tf) { 

    super.setTypeface(Util.getFont(getContext(), Util.ASSET_PATH)); 
} 

} 

переменная assetPath может быть использована для обеспечения diffrent шрифтов во время выполнения

EDIT: Here Пользовательский типfaceManager Я создал как библиотеку, чтобы сделать ее более родовой.