在android中使用发件人列出SMS时性能下降

时间:2014-04-26 14:32:20

标签: java android sms

我正在使用以下代码列出向我发送短信的唯一人员列表。它工作正常,但仍然有点慢,需要4到5秒加载,我有650条短信在我的设备任何建议?

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       listSMS();
    }

private void listSMS()
{
    TextView tview = (TextView) findViewById(R.id.list);
    Uri uriSMSURI = Uri.parse("content://sms/inbox");
    ContentResolver cr= this.getContentResolver();
    Cursor cur = cr.query(uriSMSURI, null, null, null, null);
    LinkedHashSet contactList= new LinkedHashSet();
    String sms = "";
    while (cur.moveToNext()) {
        if(!contactList.contains(cur.getString(2)))
        {
            contactList.add(cur.getString(2));
            sms += "From :" + getContactName(cur.getString(2),cr)+"\n";
        }
    }
    cur.close();
    tview.append(sms);

}

public static String getContactName(String num, ContentResolver cr) {
        Uri u = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI,Uri.encode(num));
        String[] projection = new String[] { ContactsContract.Contacts.DISPLAY_NAME};

        Cursor c = cr.query(u, projection, null, null, null);

        try {
            if (!c.moveToFirst())
                return num;

            int index = c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
            return c.getString(index);

        } finally {
            if (c != null)
                c.close();
        }
    }

1 个答案:

答案 0 :(得分:1)

不是预先准备好名字的联系人列表,然后将其传递给适配器,而是尝试仅使用ID准备列表,然后在适配器内获取相应的名称。这将解决启动延迟,但会使ListView的滚动速度变慢,这可以通过使用View Holder或某些缓存机制来解决,以防止多次获取相同的名称。另请注意,适配器将查询当前仅对用户可见的联系人姓名。