活动缓慢转换:LogCat中多次“初始化膨胀状态”

时间:2013-03-27 20:46:51

标签: android android-listview custom-component android-logcat

为了在我的ListActivity中提供自定义字体,我根据此示例here编写了一个CustomAdapter扩展BaseAdapter的字段。

但是,如上所述,我编写了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填充了从SQLite数据库中获取的信息。同样在这里,我为每个TextView设置了一个自定义字体。即使屏幕变黑持续2-3秒(显示应用程序崩溃),然后新的Activity出现,也会发生这种情况。这不会从应用程序中的其他位置访问Activity

在这两种情况下 - 访问ListActivity并访问GameActivity中的ListActivity - 几个

  

“szipinf - 初始化膨胀状态”

消息显示在LogCat中。在这种情况下,它们意味着什么?将onItemClickListener设置为getView()的{​​{1}}方法会更好吗?有些东西似乎真的会抑制过渡,但是我无法弄清楚是什么,因为没有什么可以计算或处理的大事(事实上,在SQLite数据库中,每5个字段只有两个条目)?

修改 如果需要或需要,我当然可以提供更多代码。

1 个答案:

答案 0 :(得分:4)

我有完全相同的问题,你的问题给了我答案!

我仍然不知道确切的根本原因,但这是因为在我的情况下多次从资产中读取自定义字体。 如果我的屏幕上有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);
    }
}

我创建了自定义类to 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可用于在运行时提供不同的字体

编辑Here是我创建的自定义typefaceManager,使其更通用。

相关问题