2

最近在我的一个应用程序中使用时,我经历了相当多的延迟ListView。大约在问题出现的同时,我在关闭应用程序时开始收到以下错误消息。

E/libEGL(8501): error creating cache file /data/data/[my application's namespace]/cache/com.android.opengl.shaders_cache: No such file or directory (2)

由于我的设备没有植根,我无权访问该位置,并且可以验证文件是否存在、已损坏或已被删除。我不确定问题是什么。首先,这些问题是否相关?这似乎是一个奇怪的巧合。要清楚;我确实使用视图持有者模式来优化我的ListView,并且它之前工作得很好,所以我的实现不太可能是罪魁祸首。

更新根据要求,这里是我的适配器getView方法的代码。虽然我不认为它与问题有任何关系,但它在大约 5 个月之前运行良好,我很高兴满足您的问题。

@Override
public View getView(int position, View convertView, ViewGroup parentViewGroup)
{       
    final PersonaViewHolder viewHolder;
    final Persona persona = provider[position];

    if (convertView == null)
    {
        convertView = LayoutInflater.from(parentViewGroup.getContext()).inflate(R.layout.list_personas, null);

        viewHolder = new PersonaViewHolder(
                (ImageView) convertView.findViewById(R.id.persona_icon),
                (TextView) convertView.findViewById(R.id.persona_description));
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (PersonaViewHolder) convertView.getTag();
    }

    Bitmap icon = BitmapFactory.decodeResource(parent.getResources(), persona.getPicture());
    viewHolder.setIcon(icon, 50, 50);
    viewHolder.setDescription(persona.getName() + " is a " + persona.getType() + "!");

    return convertView;
}
4

1 回答 1

2

正如您可能知道的那样,getView()应避免在您的方法中进行任何类型的实际处理。虽然我无法谈论缓存文件问题,但我确实注意到您有这行:

Bitmap icon = BitmapFactory.decodeResource(parent.getResources(), persona.getPicture());

在你的getView()方法中。您应该考虑实现一个LruCache来缓存您的位图。可以在此处找到相关文档:http: //developer.android.com/training/displaying-bitmaps/cache-bitmap.html

另外,上线

convertView = LayoutInflater.from(parentViewGroup.getContext()).inflate(R.layout.list_personas, null);

你不应该使用.inflate(R.layout.list_personas, null);,而是使用.inflate(R.layout.list_personas, parent, false);

注意最后一个参数的区别。这是将视图附加到其父级的正确方法。它可能不会提高性能,但它是正确的。

于 2013-09-02T14:40:58.617 回答