所以我定义了一个基于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)
方法,特别是膨胀过程是滞后的资源。但是如何避免呢?如何优化此视图以更快地实例化它?
答案 0 :(得分:1)
我认为你不能给视图充气,然后将其缓存以备将来使用(即第二次进入构造函数),因为你会得到像“view has have a parent”这样的错误。但是,我不知道你膨胀的字体是否也一样..也许那个是可重用的。
此外:我不知道你的R.layout.alphabet_button
是否包含很多图片?如果是这种情况你可能想要摆脱其中的一些,支持xml生成的图形,比如使用xml形状/渐变等。根据我的经验,那些加载更快。如果你无法摆脱你的图像,你至少可以加载一次,然后将它们复制到内存中,而不是每次都给它们充气(所以不要把它们放在你的layout.xml中,而是将它们设置在你的ImageView之后使用setImageBitmap()
或setImageDrawable()
等方法。
与往常一样使用这些缓存技巧:务必检查应用程序是否存在内存泄漏; - )