也许我会以错误的方式解决这个问题,但如果是这样,请指正。情况如下:我有一个查询,它返回存储在数据库中的铃声的URI字符串。我已经扩展了SimpleCursorAdapter以覆盖getView()函数来查询RingtoneManager以获取相关振铃器URI的TITLE,但是getView()函数每行被调用多次并且使我的应用程序减慢了很多。我有没有办法运行该函数一次将uris映射到标题并将数据存储在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()函数来缓存数据或仅查询每个项目一次? 或者 - 我有更好的方法来接近这个吗?
由于
答案 0 :(得分:0)
解决此问题的一种方法是将Map
与Adapter
保持相同的生命周期。 Map
只是getRingerTitle()
次调用的缓存。无论何时更换或Map
适配器,请务必刷新requery()
。
或者,将原始Cursor
包裹在CursorWrapper
中并覆盖相应的方法,以便将原始Cursor
有效地“扩展”一列。您在Map
实现中保留上述CursorWrapper
并返回缓存值(或调用getRingerTitle()
并缓存它)以获取额外列。这与第一段中的基本方法相同,但提供了一些更清晰的抽象。
您没有说明getRingerTitle()
到底做了什么。如果它是另一个数据库查询,并且您的原始Cursor
来自数据库查询,请考虑使用连接来避免额外的数据库I / O.
此外,请勿覆盖getView()
上的SimpleCursorAdapter
。改为覆盖newView()
和bindView()
。