gpt4 book ai didi

Android加载联系人太慢

转载 作者:太空狗 更新时间:2023-10-29 12:55:23 25 4
gpt4 key购买 nike

在我的应用程序中,有 5 个微调器填充了手机中的联系人。我正在使用下面的代码用联系人填充一个数组,然后用数组的项目填充微调器(这里只有 1 个微调器)。

当用户打开应用程序时,微调器会被填充,因此用户可以为每个微调器选择一个名称。问题是,当用户打开应用程序时,用微调器加载布局大约需要 3 秒。玩过代码后,我发现无论应用程序中的微调器有多少,问题的根源在于用联系人填充数组的代码。我还找到了缓慢的原因:我在我兄弟的手机上运行了该应用程序,然后它以应有的速度打开。他手机里只有30个联系人,而我有500个左右,大部分都是Facebook联系人。那么我该如何帮助解决这种情况呢?

这就是问题所在,与旋转器的数量无关。如果联系人太多,这会变慢:

 contactName = null;
final Context context = getApplicationContext();

ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
if (cur.getCount() > 0)
{
while (cur.moveToNext()) {
String idc = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
String namec = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

if (Integer.parseInt(cur.getString(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[]{idc}, null);
while (pCur.moveToNext()) {
contactName = pCur.getString(pCur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

myArr.add(contactName);
}
pCur.close();
}

}
}

myArr.add("");
Collections.sort(myArr);

这就是我填充每个微调器的方式(并让它们显示之前选择的名称):

        Spinner sp1 = (Spinner) findViewById(R.id.Spinner01);
ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, myArr);
sp1.setAdapter(adapter1);
sp1.setOnItemSelectedListener(new MyOnItemSelectedListener1());


mprefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
val1 = mprefs.getString("value1", "No name");
if (!val1.equals("No name"))
{
for (int i=0; i<myArr.size(); i++)
{
if (val1.equals(myArr.get(i)))
{
num = i;
}
}
sp1.setSelection(num);
}
else
{
sp1.setSelection(0);
}

解决方案基于 Jesse van Assen 的想法:

原来问题出在第二个查询上。我删除了这个并为我需要的列创建了一个“投影”变量:

final String[] projection = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.HAS_PHONE_NUMBER
};
String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + "='1'";

ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, projection, selection, null, null);
if (cur.getCount() > 0)
{
while (cur.moveToNext()) {
String idc = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
String namec = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
myArr.add(namec);
}
}

所以现在我有一个只收集所需记录的查询。然而,即使是查询数据集和第二个查询,它也很慢。真正的解决方案是删除第二个查询,但是收集比整个数据库少的记录是个好主意。

最佳答案

我会说你查询联系人数据的方式是错误的。

看起来您正在从数据库中获取所有联系人以及所有联系人的数据,然后在 while 循环中过滤联系人。我建议从查询中执行此操作,像这样(未测试):

Cursor cur = cr.query(
ContactsContract.Contacts.CONTENT_URI,
new String[] { "_ID", "DISPLAY_NAME" },
"HAS_PHONE_NUMBER = ?", new String[] { "1" },
null);

关于Android加载联系人太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7299570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com