我最近在我的一个应用程序中使用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;
}
答案 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);
注意最后一个参数的区别。这是将视图附加到其父级的正确方法。它可能无法提高性能,但它是正确的。