Listview滞后;缓存文件的问题?

时间:2013-09-02 14:18:41

标签: android caching opengl-es

我最近在我的一个应用程序中使用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)

由于我的设备没有root权限,因此我无法访问该位置,并且可以验证该文件是否存在,已损坏或已被删除。我不确定问题是什么。首先,问题可能是相关的吗?这似乎是一个奇怪的巧合。要清楚;我确实使用了一个视图持有者模式来优化我的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;
}

1 个答案:

答案 0 :(得分: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);

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