没有使用`getContentResolver()`有没有其他方式访问联系人?

时间:2018-06-15 12:39:40

标签: android android-contentprovider android-contacts android-contentresolver

我的应用程序总是很慢,有时会崩溃,因为访问联系人列表,我正在使用getContentResolver(),这使我的应用程序运行另一个进程到主进程。每当该额外进程运行时,我的应用程序就开始变慢并崩溃。

那么,有没有想过访问联系人列表而不转到getContentResolver()

2 个答案:

答案 0 :(得分:0)

使用AsyncTaskLoader从设备获取联系人,建议使用它,因为它是异步的,并且也适用于活动生命周期。

答案 1 :(得分:0)

您应该使用AsynTask在后​​台主题

中完成此项工作
private class LoadContacts extends AsyncTask<Void, Boolean, Boolean> {  
    protected void onPreExecute() {
        Log.e("LS", "Start !");
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        ContentResolver cr = getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
        try {
            if (cur.getCount() > 0) {
                while (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));
                            String data = "Name : " + name + " - Phone : " + phoneNo;
                        }
                        pCur.close();
                    }
                }
            }
            cur.close();
        } catch (NullPointerException | java.io.IOException e) {
            Log.e("LS", e.getMessage());
        }
        return true;
    }

    protected void onPostExecute(Boolean result) {
        Log.e("LS", "Done !");
    }
}
相关问题