Hi!

I got an ANR in an application which used the CursorAdapter, and I
started thinking if it's allowed to be used or not.
It's pretty common to create a ListActivity (or just an Activity with
a ListView) and set a CursorAdapter as adapter to it. However when the
data set changes, the CursorAdapter gets the callback and calls
requery (of it's enabled of course). However this requery could result
in a database access, which is really bad in the main thread (like in
my case).

This is the stacktrace:

android.database.sqlite.SQLiteDatabase.lock (SQLiteDatabase.java:378)
android.database.sqlite.SQLiteQuery.fillWindow (SQLiteQuery.java:64)
android.database.sqlite.SQLiteCursor.fillWindow (SQLiteCursor.java:
287)
android.database.sqlite.SQLiteCursor.getCount (SQLiteCursor.java:268)
android.database.CursorWrapper.getCount (CursorWrapper.java:70)
android.database.MergeCursor.getCount (MergeCursor.java:61)
android.widget.CursorAdapter.getCount (CursorAdapter.java:132)
android.widget.HeaderViewListAdapter.getCount
(HeaderViewListAdapter.java:132)
android.widget.AdapterView$AdapterDataSetObserver.onChanged
(AdapterView.java:782)
android.database.DataSetObservable.notifyChanged
(DataSetObservable.java:31)
android.widget.BaseAdapter.notifyDataSetChanged (BaseAdapter.java:50)
android.widget.CursorAdapter$MyDataSetObserver.onChanged
(CursorAdapter.java:385)
android.database.DataSetObservable.notifyChanged
(DataSetObservable.java:31)
android.database.AbstractCursor.requery (AbstractCursor.java:97)
android.database.sqlite.SQLiteCursor.requery (SQLiteCursor.java:548)
android.database.CursorWrapper.requery (CursorWrapper.java:211)
android.database.MergeCursor.requery (MergeCursor.java:249)
android.widget.CursorAdapter.onContentChanged (CursorAdapter.java:361)
android.widget.CursorAdapter$ChangeObserver.onChange
(CursorAdapter.java:377)
android.database.ContentObserver$NotificationRunnable.run
(ContentObserver.java:43)
android.os.Handler.handleCallback (Handler.java:587)
android.os.Handler.dispatchMessage (Handler.java:92)
android.os.Looper.loop (Looper.java:123)
android.app.ActivityThread.main (ActivityThread.java:3701)
java.lang.reflect.Method.invokeNative
java.lang.reflect.Method.invoke (Method.java:507)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:866)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:624)
dalvik.system.NativeStart.main

So, does this mean that simply using CursorAdapter (with
autoRequery=true) is dangerous? If yes, what is the proper way to use
it?

Thanks in advance!
/Pal Szasz

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to