カーソルリーク(CursorLeak)


通常、try-finallyを使用して、プログラムが異常な場合にカーソルを正常に閉じることを確認します.
 
Cursor cursor = null;
try {
	cursor = getContentResolver().query(URI, .....);
        //dosomething
} finally {
	if (cursor != null) {
		cursor.close();
	}
}

典型的な書き方ですが、カーソルが漏れないようにすることはできません.次は、このような書き方で発生した異常です.
 ERROR/CursorLeakDetecter(11085):
android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 
at android.content.ContentResolver.query(ContentResolver.java:323)
try-finallyの書き方に論理的な問題はないので、このコードの問題を疑わないことに少し注意しないでください.ここではマルチスレッドシーンを考慮していないため、try-finallyは、dosomething時にqueryオープンカーソルが他のスレッドによって再び呼び出されることを保証することはできません.したがって、マルチスレッドが存在する呼び出しに遭遇した場合、カーソルを閉じるまで開いてロックを追加する必要があります.すなわち、try-finallyブロックにロックを追加します.