0

这两个都泄漏了我的活动,当它超过 1mb 堆内存时。我需要删除超过 1mb 的联系人,即;超过 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

使用 Loader 在单独的线程上运行查询。这在 Loaders 下的 Developers Guide 中有记录。顺便说一句,managedQuery() 已被弃用。

永远不应该直接在 Activity 上运行查询。你会很快把所有东西都挂起来。

您还询问有关删除联系人的问题,尽管我没有看到任何执行此操作的代码。

为此,您应该使用 ContentProviderOperation 对象和 ContentResolver.applyBatch() 删除它们。除非您想非常着急,否则将每个 ContentProviderOperation 对象标记为“yield allowed”。

ArrayList oparray = 新的 ArrayList;

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

oparray.add(obj);

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

这会很慢,具体取决于有多少联系人数据。

于 2012-03-02T23:14:52.167 回答