【问题标题】:Fetch data from contacts take too much time in android从联系人中获取数据在android中花费了太多时间
【发布时间】:2020-05-06 01:07:22
【问题描述】:

我正在使用 android 设备联系人。如果 android 设备联系人超过 五个 ,则从联系人获取数据需要 在空白屏幕上花费太多时间。我已经使用下面的代码来获取数据

private void fetchContacts1() {
    String order = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC";
    Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, order);
    while (cursor.moveToNext()) {
        String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
        String phonenumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

    }
 cursor.close();
}

我显示所有联系人以回收视图。有些设备有超过一万个联系人。你能建议我如何处理它。

【问题讨论】:

  • 我建议你将光标作为一个字段存储在你的类中,一次只返回 100 个。然后,只要你还没有走到尽头,你就会一直要求更多。除了进度条或取消对话框外,这还可以为用户提供一些反馈并允许他们取消。
  • @user2740650 你能提供例子吗?

标签: android


【解决方案1】:

使用异步任务在后台加载您的联系人。首次加载后将联系人列表存储到本地数据库

以下链接可能对您有所帮助

https://developer.android.com/guide/components/loaders

https://stackoverflow.com/a/40017905/10239870

  class ContactLoader extends AsyncTask<Void, Void, List<Contact>> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //visible your progress bar here
    }

    @Override
    protected List<Contact> doInBackground(Void... voids) {
        List<Contact> contacts = new ArrayList<>();
        String order = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC";
        Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, order);
        while (cursor.moveToNext()) {
            String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String phonenumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            contacts.add(new Contact(name, phonenumber));
        }
        cursor.close();
        return contacts;
    }

    @Override
    protected void onPostExecute(List<Contact> contactList) {
        super.onPostExecute(contactList);
        //set list to your adapter
    }
}


  class Contact {
    String name;
    String number;

    public Contact(String name, String number) {
        this.name = name;
        this.number = number;
    }

    public String getName() {
        return name;
    }

    public String getNumber() {
        return number;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setNumber(String number) {
        this.number = number;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多