如何优化自定义视图?

时间:2013-05-01 13:54:26

标签: android optimization view

所以我定义了一个基于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)方法,特别是膨胀过程是滞后的资源。但是如何避免呢?如何优化此视图以更快地实例化它?

1 个答案:

答案 0 :(得分:1)

我认为你不能给视图充气,然后将其缓存以备将来使用(即第二次进入构造函数),因为你会得到像“view has have a parent”这样的错误。但是,我不知道你膨胀的字体是否也一样..也许那个是可重用的。

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

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