#java #android #cursor #android-sqlite #try-with-resources
#java #Android #android-sqlite #android-cursor #try-with-resources
Вопрос:
Поскольку Java представила это утверждение с 1.7, я принял это правило для написания моего оператора, связанного с курсором, следующим образом:
try (Cursor cursor = context.getContentResolver().query(queryAccountUri, null, null, null, null)) {
if (cursor != null amp;amp; cursor.moveToFirst()) {
entry.userId = cursor.getString(0);
entry.account = cursor.getString(1);
entry.phone = cursor.getString(2);
entry.nickName = cursor.getString(3);
entry.icon = cursor.getString(4);
}
} catch (Exception e) {
e.printStackTrace();
}
Однако в эти дни наши тестировщики продолжали сообщать мне, что это утверждение по-прежнему вызывало утечку памяти во время выполнения обезьяньих тестов или даже истощало всю память при выполнении циклического тестирования этого метода. Во всех файлах журнала указано, что cursor
объект является убийцей из-за какой NOT CLOSING
-то проблемы. Соответственно, я должен изменить свой код, чтобы закрыть cursor
объект вручную следующим образом:
try {
if (cursor.moveToFirst()) {
entry.userId = cursor.getString(0);
entry.account = cursor.getString(1);
entry.phone = cursor.getString(2);
entry.nickName = cursor.getString(3);
entry.icon = cursor.getString(4);
}
} catch (NullPointerException e) {
e.printStackTrace();
} finally {
try {
cursor.close();
} catch (NullPointerException e) {
e.printStackTrace();
}
}
Я просмотрел Java doc для этого утверждения, и теперь мне интересно, действительно ли это утверждение работает с общим «закрываемым объектом» или только с «чистым объектом, связанным с Java reader / writer»?
Комментарии:
1. Лучше, если бы вы могли опубликовать журнал утечек.