当它超过1mb堆内存时,这两个都在泄漏我的活动。我需要删除超过1mb的conacts i,e;超过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
答案 0 :(得分:0)
使用Loader在单独的线程上运行查询。这在“加载程序”下的“开发人员指南”中有记录。顺便说一下,不推荐使用managedQuery()。
您应该从不直接在Activity上运行查询。你会很快挂掉所有东西。
您也会询问有关删除联系人的信息,但我没有看到任何执行此操作的代码。
为此,您应该使用ContentProviderOperation对象删除它们 ContentResolver.applyBatch()。除非你想匆忙地做,否则标记每一个 具有“允许产量”的ContentProviderOperation对象。
ArrayList oparray = new ArrayList;
objBuilder = ContentProviderOperation.newDelete(ContactsContract.Contacts.CONTENT_URI); objBuilder.withYieldAllowed(真); obj = objBuilder.build();
oparray.add(OBJ);
getContentResolver()。applyBatch(ContactsContract.AUTHORITY,oparray);
这将会很慢,具体取决于联系人数据的数量。