android 获取联系人详细信息,例如号码和缩略图

标签 android performance thumbnails android-contentprovider android-contacts

我使用此代码可以获取联系人的号码和联系人的缩略图,但这不合适,并且需要很长时间才能加载和准备联系人。

请帮助我提高此代码的性能:

List<Contact_Pojo> list = new ArrayList<Contact_Pojo>();
ContentResolver cr = getActivity().getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
        null, null, Phone.DISPLAY_NAME + " ASC");

int i = 0;
if (cur.moveToFirst()) {
    while (cur.moveToNext()) {

        Cursor phoneCursor = getActivity()
                .getContentResolver()
                .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER, },
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                + " = ?",
                        new String[] { cur.getString(cur
                                .getColumnIndex(ContactsContract.Contacts._ID)) },
                        null);

        if (phoneCursor.moveToFirst()) {
            Contact_Pojo personContact = new Contact_Pojo();
            /*
             * Id
             */
            personContact.setId(cur.getString(1));
            /*
             * Name
             */
            personContact
                    .setName(cur.getString(cur
                            .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
            /*
             * Photo ID
             */
            personContact
                    .setImageUrl(cur.getString(cur
                            .getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI)));
            /*
             * Number
             */
            personContact.setNumber(phoneCursor.getString(0));
            //
            list.add(personContact);
        }

        phoneCursor.close();

    }
}

cur.close();
return list;

2015 年 4 月 4 日更新

  • 它很慢,因为它从联系人提供商那里获取了所有列,在此表中有 +20 列需要很多时间。

最佳答案

使用 AsyncTaskLoader 怎么样,

当你想获取联系人列表时编写此代码

getLoaderManager() or getSupportLoaderManager().initLoader(int id, Bundle args, LoaderManager.LoaderCallbacks<D> loadingCallback)

public class LoadingCallback implements LoaderManager.LoaderCallbacks<Void> {
  @Override
  public Loader<Void> onCreateLoader(int i, Bundle bundle) {
    // Show your dialog;
    return new InitializeContactsTask(context, (ArrayList) contactList, mAdapter);
  }

  @Override
  public void onLoadFinished(Loader<Void> voidLoader, Void aVoid) {
    // UI Work here after background task and hide dialog.
  }

  @Override
  public void onLoaderReset(Loader<Void> voidLoader) {
  }
}

public class InitializeApplicationsTask extends AsyncTaskLoader<Void> {
  @Override
  protected void onStartLoading() {
      forceLoad();
  }

  @Override
  public Void loadInBackground() {
      // Query the contacts here and return null

      return null;
  }
}

关于android 获取联系人详细信息,例如号码和缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29399398/

相关文章:

css - 博客 |为 iframe 视频创建自定义缩略图

java - 从手机号码中提取国家代码

performance - O(N) 是什么意思

java - Apache 公地网 : Should I create a new FTPClient object on each connection or reuse one?

javascript - 缩略图滚动时显示的弹出窗口是如何设计的? JavaScript、CSS

youtube - YouTube Storyboard脚本-更大的缩略图?

android - 无法解析方法setReverseLayout和setStackFromEnd?

java - 传递 PBEKeySpec 时 SecretKeyFactory generateSecret 错误

php - 如何使用 ip 指定端口号以注册 gcm 服务器

java - 循环中IF的优雅解决方案