Слишком много времени ушло на сохранение контакта

Если вы не можете запустить GUI-приложение, такое как ProcessExplorer, и вы ищете аргументы «Командная строка» для процессов, вы можете использовать «wmic» через командную строку. Например:

wmic PROCESS get Processid,Caption,Commandline

Если вы хотите найти конкретный процесс, вы можете сделать это:

wmic PROCESS where "name like '%java%'" get Processid,Caption,Commandline

. Вывод этого будет показывать вам все аргументы командной строки процессов, таких как «java».

0
задан marmor 19 January 2019 в 20:15
поделиться

1 ответ

Хорошо, много вещей, чтобы упомянуть здесь ...

Для вашего первого кода, НИКОГДА НЕ ИСПОЛЬЗУЙТЕ API Contacts.People.XX, если серьезно, для чего угодно, убедитесь, что вы ничего не импортируете из People или не используете какой-либо из его API, это очень очень старый API, который был устарел много лет назад и даже не поддерживается некоторыми устройствами.

Относительно вашего второго кода, множества ошибок и проблем, которые я попытался исправить в своем коде ниже, но специально для вашего требования к производительности, обратите внимание, что вам не нужно applyBatch для каждого контакта, если вы Создайте много контактов одновременно, можно поместить множество операций в ops ArrayList и применить их все за один раз - намного быстрее!

Примечания:

  1. Это ДОЛЖНО дать вам 100-кратное увеличение для размера кэша 100, но вы можете поиграть с этим числом, просто отметьте, что, если число слишком велико, вы рискуете получить предупреждение Java «Transaction Too Large», и пакет завершится неудачей. [1111 ]
  2. Всегда снабжайте значения ACCOUNT_TYPE / ACCOUNT_NAME чем-то связанным с вашим приложением. Я добавил к этому коду два постоянных значения MY_ACCOUNT_TYPE / MY_ACCOUNT_NAME, которые вам нужно будет определить.


ArrayList<ContentProviderOperation> ops = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
    createContact(ops, name, phone);
    if (i % 100 == 0) { // experiment with different batch sizes to achieve best performance times
        try {
            contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
        } catch (RemoteException | OperationApplicationException e) {
            Log.e(TAG, "error applying batch: ", e);
        }
        ops = new ArrayList<>();
    }
}

private void createContact(ArrayList<ContentProviderOperation> ops, String name, String phone) {

    ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
            .withValue(RawContacts.ACCOUNT_TYPE, MY_ACCOUNT_TYPE)
            .withValue(RawContacts.ACCOUNT_NAME, MY_ACCOUNT_NAME).build());

    int indexOfRawContactIdOperation = ops.size() - 1;

    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, indexOfRawContactIdOperation)
            .withValue(ContactsContract.Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
            .withValue(StructuredName.DISPLAY_NAME, name)
            .build());

    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, indexOfRawContactIdOperation)
            .withValue(ContactsContract.Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
            .withValue(Phone.NUMBER, number)
            .withValue(Phone.TYPE, Phone.TYPE_MOBILE).build());
}
0
ответ дан marmor 19 January 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: