I've never had an issue with reading on the UI thread, and even doing an
occasional small update (and my current project does use a database and
content providers quite a bit).

Speficially, CursorAdapter is intended to be used from the UI thread - its
data fetching callbacks, getCount, getItemId, etc. - are typically called by
ListView or some other AdapterView, and so run on the UI thread.

On the other hand, if you are locking the database somewhere else, this can
interfere with the above data access, which I believe is what's happening in
your code. Can you change how your worker threads write to the database, so
it takes less time?

And why would you have another *process* accessing the database?

-- Kostya

2011/4/4 space <[email protected]>

> Yes, there is another thread, doing DB access as well. But I'm
> wondering about the general case: in general, doing any DB access
> (even queries/reads) can cause ANRs (the filesystem can be blocked,
> another thread or even another process could access the same DB, etc).
> So the question is: is CursorAdapter safe or not? Or what is the
> proper way of using it?
>
> /Pal
>
> On Apr 4, 10:08 am, Kostya Vasilyev <[email protected]> wrote:
> > Reading should be Ok, perhaph there is something unusual going on in your
> > code?
> >
> > The last function on the stack is SqliteDatabase.lock - do you perhaps
> have
> > a background thread that also locks the database for a long time?
> >
> > -- Kostya
> >
> > 2011/4/4 space <[email protected]>
> >
> >
> >
> >
> >
> >
> >
> > > 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
> [email protected]
> > > To unsubscribe from this group, send email to
> > > [email protected]
> > > For more options, visit this group at
> > >http://groups.google.com/group/android-developers?hl=en
>
> --
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en
>

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

Reply via email to