我目前有一个基本程序,它贯穿所有SMS,并为每个只创建一个只存储名称,编号和最后文本的线程。然后它会从所有这些线程中创建一个列表视图(比如股票短信应用程序)......但它运行速度很慢;我怎么能让它更有效率,所以每次启动都不需要几分钟?
Uri message = Uri.parse("content://sms/");
ContentResolver cr = this.getContentResolver();
Cursor c = cr.query(message, null, null, null, null);
this.startManagingCursor(c);
int totalSMS = c.getCount();
if (c.moveToFirst()) {
for (int i = 0; i < totalSMS; i++) {
String[] projection = new String[] {ContactsContract.PhoneLookup.DISPLAY_NAME,ContactsContract.PhoneLookup._ID};
Uri contactUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(c.getString(c.getColumnIndexOrThrow("address"))));
Cursor cursor2 = this.getContentResolver().query(contactUri, projection, null, null, null);
String name = getContactName(this, c.getString(c.getColumnIndexOrThrow("address")));
String number = c.getString(c.getColumnIndexOrThrow("address"));
String msg =c.getString(c.getColumnIndexOrThrow("body"));
if (cursor2.moveToFirst()) {
// Get values from contacts database:
//contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup._ID));
name = cursor2.getString(cursor2.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));
}
//entries.add(new Entry(name, msg));
int newNumber = 1;
for(int d = 0; d < threads.size(); d++)
{
Thread t = threads.get(d);
if(t.number.equals(number))
newNumber = 0;
}
if(newNumber == 1)
threads.add(new Thread(name, number, msg));
c.moveToNext();
}
}
答案 0 :(得分:0)
您可以通过使用无限的Adapter实现来实现此目的。这正是你想要的。您还可以限制每个滚动要刷新的行数。这是一个链接。,
Android:Implementing Endless List like Android Market
https://github.com/commonsguy/cwac-endless
要使用它,您可以扩展EndlessAdapter以提供有关如何处理无尽的详细信息。具体来说,您需要能够提供独立于实际适配器中任何行的行View,它将用作占位符,而在另一种方法中,您将实际数据加载到主适配器。然后,在您的帮助下,它可以无缝转换新数据。
或者您可以创建一个简单的lazyAdapter,它将在需要时加载数据。
更新1:
使用Cursor loader有效地从数据库加载数据。 Here是示例代码
答案 1 :(得分:0)
不要读取光标中的所有列。只需读取光标您想要的列。
<强>示例强>
cr.query(uri, new String[]{"address","body"},null, null, null);
注意强>
在处理游标时,不要忘记关闭游标
将时间减少50%但不完整。