I just spend few hours analyzing and fixing a memory leak in Android application. With every orientation change the full Context
, including the whole Activity
was leaked. Long story short, the problem was caused by misuse of CursorAdapter
: in subclass constructor we called CursorAdapter(context, null, false)
instead of CursorAdapter(context, null, 0)
.
The difference is quite subtle. If you use the second constructor, you have to take care of handling content updates yourself. If you use the first constructor, the CursorAdapter
will register an additional ContentObserver
for you, but you need to manually reset the Cursor
.
The funny thing is, this behavior is described in javadocs, but the documentation is spread between the constructor and FLAG_REGISTER_CONTENT_OBSERVER
flag documentation. The second part contains most crucial information: you don’t need to use this flag when you intend to use your adapter with CursorLoader
.
If for some reason you want to use the adapter without CursorLoader
, you should use the CursorAdapter(context, null, false)
constructor, and call swapCursor(null)
when leaving the Activity
or Fragment
.