Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SMS列表视图线程_Java_Android_Sms_Contacts - Fatal编程技术网

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);