Java SMS列表视图线程
我现在有一个基本的程序,可以运行所有的短信,并为每个短信创建一个线程,只存储姓名、号码和最后的文本。然后,它会用所有这些线程创建一个列表视图,比如股票短信应用程序。。。但是它跑得很慢;我怎样才能使它更高效,使它每次开机都不需要几分钟Java SMS列表视图线程,java,android,sms,contacts,Java,Android,Sms,Contacts,我现在有一个基本的程序,可以运行所有的短信,并为每个短信创建一个线程,只存储姓名、号码和最后的文本。然后,它会用所有这些线程创建一个列表视图,比如股票短信应用程序。。。但是它跑得很慢;我怎样才能使它更高效,使它每次开机都不需要几分钟 Uri message = Uri.parse("content://sms/"); ContentResolver cr = this.getContentResolver(); Cursor c = cr.query(message, null, null,
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();
}
}
您可以通过使用无止境的适配器实现来实现这一点。这正是你想要的。您还可以限制每个滚动要刷新的行数。这里有一个链接 安卓: 要使用它,您可以扩展EndlesAdapter,以提供有关如何处理无端点的详细信息。具体地说,您需要能够提供一个独立于实际适配器中任何行的行视图,当您使用另一种方法将实际数据加载到主适配器时,该视图将用作占位符。然后,在您的帮助下,它可以无缝地转换新数据 或者,您可以创建一个简单的应用程序,在需要时加载数据 更新1:
使用有效地从数据库加载数据。是示例代码不要从光标读取所有列。只需读取光标,您需要的列是什么 样品 注 在处理游标时,不要忘记关闭游标
这将减少50%的时间,但还没有完成。这是我每个线程所需要的,但目前我只是在你第一次启动应用程序时显示屏幕。它将显示每个联系人线程的列表视图……然后您可能会使用CusorAdapter和cusorloader。检查更新1的引用。它仍然需要很长时间,因为它必须通读每一个文本。
cr.query(uri, new String[]{"address","body"},null, null, null);