1

所以我定义了一个基于LinearLayout的自定义视图:

    public class AlphabetButton extends LinearLayout{

        private Button alphabetButton;
        private ImageView usersMark;
...     
        public AlphabetButton(Context context) {
            super(context);
            load(context);
        }
...    
        private void load(Context context){
            if(isInEditMode()) 
                return;

            LayoutInflater.from(context).inflate(R.layout.alphabet_button, this, true);

            alphabetButton = (Button)findViewById(R.id.buttonAlphabetItem);
            usersMark = (ImageView)findViewById(R.id.correctWrongSelectedMark);

            alphabetButton.setTag(usersMark);

            final Typeface chalkFont = Typeface.createFromAsset(context.getAssets(), "fonts/myfont.ttf");
            alphabetButton.setTypeface(chalkFont);

        }

由于应用程序创建了大约 30 个此视图,因此它有明显的滞后(在 CPU 较弱的智能手机上大约需要 2-3 秒)。我还注意到一个日志输出(不是我的),例如:

05-01 16:47:22.224: D/szipinf(10569): Initializing inflate state
05-01 16:47:22.234: D/szipinf(10569): Initializing inflate state
05-01 16:47:22.254: D/szipinf(10569): Initializing inflate state
05-01 16:47:22.264: D/szipinf(10569): Initializing inflate state
05-01 16:47:22.334: D/szipinf(10569): Initializing inflate state

大约有 30 行相同的行。所以我认为load(Context context)方法,尤其是膨胀过程是滞后的资源。但是如何避免呢?如何优化此视图以更快地实例化它?

4

1 回答 1

1

我不认为您可以对 View 进行膨胀,然后将其缓存以供将来使用(即第二次进入构造函数时),因为您会收到诸如“视图已经有父级”之类的错误。但是,我不知道您充气的字体是否也是如此。也许那个是可重复使用的。

此外:我不知道您是否R.layout.alphabet_button包含很多图像?如果是这种情况,您可能希望摆脱其中的一些,转而支持 xml 生成的图形,例如使用 xml 形状/渐变等。根据我的经验,这些加载速度更快。如果你不能摆脱你的图像,你至少可以加载一次,然后将它们复制到内存中,而不是每次都膨胀它们(所以不要把它们放在你的 layout.xml 中,而是将它们设置在你的ImageView 之后使用setImageBitmap()or之类的方法setImageDrawable()

与这些缓存技巧一样:请务必检查您的应用程序是否存在内存泄漏;-)

于 2013-05-01T15:38:26.947 回答