您好我正在做一个与联系人相关的项目,我从联系人* (电子邮件,号码和联系人姓名) * 获取详细信息,但它确实很好。但是问题是需要很长时间才能获取联系人详细信息(1000+联系人,包括从社交网站同步的联系人)。所以我为此目的放了一个Asynchronous Task
,并且它做得很好,但问题是由于很长一段时间才完成提取过程,当我按下后退按钮时它在异步任务中崩溃。我的问题不会崩溃为什么这个提取联系人需要花费很多时间。是否有办法获得contact
更快。public void readContact() {
contactname = new ArrayList<String>();
contactnumber = new ArrayList<String>();
companyname_one = new ArrayList<String>();
contactemail = new ArrayList<String>();
people = getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI, null, null, null,
PhoneLookup.DISPLAY_NAME);
while (people.moveToNext()) {
int nameFieldColumnIndex = people
.getColumnIndex(PhoneLookup.DISPLAY_NAME);
String contact = people.getString(nameFieldColumnIndex);
if (contact == null) {
contactname.add("No contact Set");
} else {
contactname.add(contact);
}
String szId = people.getString(people
.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
cursor_one = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "='"
+ szId + "'", null, null);
if (cursor_one.moveToNext()) {
String number = cursor_one.getString(cursor_one
.getColumnIndex(Phone.NUMBER));
contactnumber.add(number);
cursor_one.close();
} else {
contactnumber.add("no number");
cursor_one.close();
}
emails_value = getContentResolver().query(
Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "='"
+ szId + "'", null, null);
if (emails_value.moveToNext()) {
email_sorting = emails_value.getString(emails_value
.getColumnIndex(Email.DATA));
checkAll();
} else {
contactemail.add("no email");
emails_value.close();
}
}
people.close();
System.out.println("noz " + contactnumber);
System.out.println("name" + contactname);
System.out.println("email" + contactemail);
System.out.println("noz size " + contactnumber.size());
System.out.println("name size " + contactname.size());
System.out.println("contactemail size " + contactemail.size());
}
获取联系方式的代码如下所示
checkAll()
public boolean checkAll() {
boolean chkAll = true;
Pattern p1 = Pattern.compile(".+@.+\\.[a-z]+");
Matcher m1 = p1.matcher(email_sorting.trim());
if (!m1.matches()) {
contactemail.add("no email");
contactemail_sort.add("no email");
emails_value.close();
chkAll = false;
} else {
contactemail.add(email_sorting);
contactemail_sort.add(email_sorting);
emails_value.close();
chkAll = true;
}
return chkAll;
}
方法是电子邮件的模式匹配,如下所示
{{1}}
答案 0 :(得分:3)
好的,我想我终于看到了最好的工作方式。您应该创建一个接受people
游标的自定义CursorAdapter,并使用在后台线程上执行的cursor_one
查询填充自定义视图,而不是在创建适配器之前删除所有联系信息。 。这应该利用ListView的自然延迟加载,并使其按照您的意愿工作。
如果您至少使用Android 3.0,则可以使用加载程序而不是使用AsyncTask。
我找到了一个自定义游标适配器here的示例,这是我用来制作示例的。可能有更好的方法在代码中实现它,但这至少可以告诉你要覆盖哪些方法以及放入哪些方法。
public class ContactListCursorAdapter extends SimpleCursorAdapter {
private Context context;
private int layout;
public ContactListCursorAdapter (Context context, int layout, Cursor c, String[] from, int[] to) {
super(context, layout, c, from, to);
this.context = context;
this.layout = layout;
}
// Used to populate new list items
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
Cursor c = getCursor();
final LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(layout, parent, false);
int nameCol = c.getColumnIndex(People.NAME);
String name = c.getString(nameCol);
/**
* Next set the name of the entry.
*/
TextView name_text = (TextView) v.findViewById(R.id.name_entry);
if (name_text != null) {
name_text.setText(name);
}
getDeatils(v,c);
return v;
}
// Used to bind a new item from the adapter to an existing view
@Override
public void bindView(View v, Context context, Cursor c) {
int nameCol = c.getColumnIndex(People.NAME);
String name = c.getString(nameCol);
/**
* Next set the name of the entry.
*/
TextView name_text = (TextView) v.findViewById(R.id.name_entry);
if (name_text != null) {
name_text.setText(name);
}
getDetails(v,c);
}
private void populateDetails(View v, Cursor c) {
// Start your AsyncTask or Loader to get the details.
// Be sure to populate the view with the results in the
// appropriate completion callback.
}
}
答案 1 :(得分:0)
我的建议是重新定义你的结构如何运作。例如,它可以很快获得有关联系人,显示名称和其他元数据的基本信息。在列表或其他内容中显示,然后在他们选择或查看联系人时,然后加载其余信息。
这会加速它。但是,如果您必须立即加载有关联系人的所有内容,那么由于您需要执行多少查询,因此它将非常慢。
另一个建议是将它们显示为完成给用户。这样就有了一些进展,他们可以看到它。而不只是放置一个说“正在加载等待”的对话框。