为了账号安全,请及时绑定邮箱和手机立即绑定

如何提高数组列表的获取速度?

如何提高数组列表的获取速度?

守着星空守着你 2022-06-15 17:18:18
我正在使用 anArraylist来获取我的应用程序中的所有可用联系人。这效率不高,因为几乎Arraylist需要很长时间才能获取和填充.Listview600+ contacts我正在寻找一种性能更好的替代方法。虽然我搜索了其他相关问题,但我找不到方便的问题。这是我的java代码:private List<String> getContactList() {      List<String> stringList=new ArrayList<>();      ContentResolver cr = context.getContentResolver();      Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,        null, null, null, null);      if ((cur != null ? cur.getCount() : 0) > 0) {        while (cur != null && cur.moveToNext()) {          String id = cur.getString(            cur.getColumnIndex(ContactsContract.Contacts._ID));            String name = cur.getString(cur.getColumnIndex(            ContactsContract.Contacts.DISPLAY_NAME)          );          if (cur.getInt(cur.getColumnIndex(            ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0) {              Cursor pCur = cr.query(                                  ContactsContract.CommonDataKinds.Phone.CONTENT_URI,                null,                ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",                  new String[]{id}, null               );               while (pCur.moveToNext()) {                 String phoneNo = pCur.getString(pCur.getColumnIndex(                 ContactsContract.CommonDataKinds.Phone.NUMBER));                                   Log.v("Data : ",""+id+" "+name+" "+phoneNo);                 stringList.add(id);                 stringList.add(name);                 stringList.add(phoneNo);               }               pCur.close();             }            }          }          if(cur!=null){            cur.close();          }          return stringList;        }   
查看完整描述

3 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

您的查询效率低下,您目前正在为每个联系人执行一个非常慢的查询,您可以通过一个大查询(非常快)获得所有信息:


String[] projection = new String[] { Phone.CONTACT_ID, Phone.DISPLAY_NAME, Phone.NUMBER };

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

while (c.moveToNext()) {

   long contactId = c.getLong(0);

   String name = c.getString(1);

   String phone = c.getString(2);

   Log.i("Phones", "got contact phone: " + contactId + " - " + name + " - " + phone);

}

c.close();


查看完整回答
反对 回复 2022-06-15
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

您可以考虑使用该Paging库:https ://developer.android.com/topic/libraries/architecture/paging/

它的设计理念是列表仅显示一定数量的项目,因此实际上无需加载超出其可能显示的方式。例如,一个 ListView 可能只显示 10 个联系人,因此无需获取 600 个联系人。

相反,当用户滚动时,分页库将获取更少量的数据,从而消除 600 个联系人的加载时间、600 个联系人的内存等等......从而提高效率。


查看完整回答
反对 回复 2022-06-15
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

如果您担心速度,我会尝试使用 Set,尽管 ArrayList 中有 600 多个联系人应该不成问题。当数据集达到数百万甚至更多时,它就会成为一个问题。我会尝试查看您的代码中的任何其他低效之处。

就 Set 而言,最常见的两种 Java 数据结构是 HashSet 和 TreeSet。TreeSet 如果你想对集合进行排序。HashSet 稍微快一点,但是你失去了排序。两者都有 O(1) 访问时间。


查看完整回答
反对 回复 2022-06-15
  • 3 回答
  • 0 关注
  • 249 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信