也许我会采用错误的方式,但是如果是这样,请纠正我。这是一种情况:我有一个查询,该查询返回存储在数据库中的铃声的URI字符串。我已经扩展了SimpleCursorAdapter来覆盖getView()函数,以在RingtoneManager中查询关联的铃声URI的标题,但是每行多次调用getView()函数,这会使我的应用程序运行速度大大降低。有没有一种方法可以一次运行该函数以将uri映射到标题并将该数据存储在getView()可以快速访问数据的位置?
相关代码段:
public String getRingerTitle(String uriString) {
Uri ringtoneUri = Uri.parse(uriString);
Ringtone r = RingtoneManager.getRingtone(this.context, ringtoneUri);
return r.getTitle(context);
}
public View getView(int position, View convertView, ViewGroup parent)
{
View v = convertView;
if (v == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(this.layout, null);
}
this.cursor.moveToPosition(position);
String ringer = this.cursor.getString(this.cursor.getColumnIndex(PoolDbAdapter.KEY_RINGER));
TextView rTitle = (TextView) v.findViewById(R.id.ringer_line_item);
rTitle.setText(getRingerTitle(ringer));
return(v);
}
如何优化getRingerTitle()函数以缓存数据或仅查询每个项目一次?或者-有更好的方法来应对这个问题吗?
谢谢
解决这个问题的一种方法是保持Map与您的寿命相同Adapter。该Map仅仅是一个缓存getRingerTitle()调用。确保Map每次更换或requery()适配器时都冲洗。
或者,将原件包裹Cursor在中CursorWrapper并覆盖适当的方法,以有效地将原件“扩展” Cursor一列。您将Map在CursorWrapper实现中保留上述内容,并getRingerTitle()为多余的列返回缓存的值(或调用并缓存它)。这与第一段中的基本方法相同,但是提供了更简洁的抽象。
您没有指明getRingerTitle()确切的用途。如果这是另一个数据库查询,而您的原始Cursor查询来自数据库查询,请考虑使用联接以避免额外的数据库I / O。
另外,请勿getView()在上覆盖SimpleCursorAdapter。覆盖newView()和bindView()代替。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。