0

ヒープメモリが1MBを超えると、これらの両方が私のアクティビティをリークしています。1MBを超えるconactsを削除する必要があります。2500以上の連絡先。

Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
Cursor cur = managedQuery(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

代替案または回避策は何ですか?それから私はします

if (cur.moveToFirst()) {
        do {
            String lookupKey = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
            Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey);
            cr.delete(uri, null, null);             
        } while (cur.moveToNext());    
    }
    cur.close(); 

一度に100〜200件の連絡先のみを削除するにはどうすればよいですか?または他の方法?

ログ:

03-02 14:26:57.317: E/CursorWindow(5357): need to grow: mSize = 1048576, size = 216, freeSpace() = 135, numRows = 2616
03-02 14:26:57.317: E/CursorWindow(5357): not growing since there are already 2616 row(s), max size 1048576
03-02 14:26:57.317: E/CursorWindow(5357): The row failed, so back out the new row accounting from allocRowSlot 2615
03-02 14:26:57.317: E/Cursor(5357): Failed allocating fieldDir at startPos 0 row 2615
4

1 に答える 1

0

ローダーを使用して、別のスレッドでクエリを実行します。これは、開発者ガイドのローダーの下に記載されています。ちなみに、managedQuery() は廃止されました。

アクティビティに対して直接クエリを実行しないでください。すぐにすべてをハングアップします。

連絡先の削除についても尋ねられますが、これを行うコードは見当たりません。

これを行うには、ContentProviderOperation オブジェクトと ContentResolver.applyBatch() を使用してそれらを削除する必要があります。急ぎの場合を除き、各 ContentProviderOperation オブジェクトに「yield allowed」のマークを付けます。

ArrayList oparray = new ArrayList;

objBuilder = ContentProviderOperation.newDelete(ContactsContract.Contacts.CONTENT_URI); objBuilder.withYieldAllowed(真); obj = objBuilder.build();

oparray.add(obj);

getContentResolver().applyBatch(ContactsContract.AUTHORITY, oparray);

連絡先データの量によっては、これは遅くなります。

于 2012-03-02T23:14:52.167 に答える