Hey Streets,

thanks.

Actually I already run this on the UI thread.

Here is my code (from a ListActivity):

        updateCursorRunnable = new Runnable() {
            public void run() {
                updateCursor();
                refreshUI();
            }
        };

  Above you see the Runnable that later on will be executed on the UI
thread.

  Here are the implementations: (I didn't cut anything out this time, maybe
I making in error in the "unimportant" stuff. If you see something else that
needs improving, like the changing of cursors, let me know.).

   private boolean updateCursor() {
        boolean cursorChanged = false;

        if (dbQuery.hasChanged()) {
            final Cursor oldCursor = listAdapter.getCursor();
            if (oldCursor != null)
                stopManagingCursor(oldCursor);

            final Cursor cursor =
getEntryManager().getContentCursor(dbQuery);
            startManagingCursor(cursor);
            listAdapter.changeCursor(cursor);
            // listAdapter.notifyDataSetChanged();
            cursorChanged = true;

        } else {
            Timing t = null;
            if (NewsRob.isDebuggingEnabled(this))
                t = new Timing("ArticleListActivity::requery", this);
            // listAdapter.notifyDataSetChanged(); doesn't work. use requery
            // instead
            listAdapter.getCursor().requery();   * <------ That's what I
mean. Would prefer notifyDataSetChanged.*

            if (t != null)
                t.stop();
        }
        return cursorChanged;
    }

    void refreshUI() {
        ((BaseAdapter) getListAdapter()).notifyDataSetChanged();
        updateButtons();
        updateControlPanelTitle();
        refreshProgressBar();
        if (getListAdapter().getCount() == 0 && !isTaskRoot())
            finish();
    }

And the Runnable is triggered like this:

 @Override
    public void modelUpdated() {
        Timing t = new Timing("modelUpdated()", this);
        runOnUiThread(updateCursorRunnable);
        t.stop();
    }

  Any ideas?

Cheers,
Mariano

On Fri, Jun 11, 2010 at 4:21 PM, Streets Of Boston
<[email protected]>wrote:

> I don't know your code, but it looks like the notifiyDataSetChanged()
> (like many other methods that can update the UI) needs to be called on
> the main GUI thread.
>
> You need to get hold of a View or a Hander (that was created on the
> main GUI thread, e.g. in your onCreate()) and call 'post' on it:
>
> // the code is executed by your background thread
> ... do stuff ...
> ...
> // communicate that the list needs updating
> viewOrHandler.post(new Runnable() {
>  public void run() {
>    myListAdapter.notifyDataSetChanged();
>  }
> });
> ...
>
>
> On Jun 3, 2:55 pm, Mariano Kamp <[email protected]> wrote:
> > Hi.
> >
> > Just watched Google IO's "World Of ListView" presentation [1]. Awesome
> > stuff. I think every Android dev should watch it.
> >
> > One gotcha for me was to use BaseAdapter.notifyDataSetChanged[2]. I
> checked
> > code that I have written more than a year ago and found that I did try to
> > use that, but commented it out with '// doesn't work' and I use requery()
> > instead. That is of course much slower.
> >
> > I now tried to find out why I wrote that it didn't work and hoped that I
> am
> > meanwhile so much wiser that it would be easier to understand the proper
> use
> > of the API. So much for ambition:  The effect I see is that the list is
> not
> > updated after I call notifyDataSetChanged(), but works with requery() and
> I
> > am not so much wiser ;-(
> >
> > What could be the issue here? I use a ResourceCursorAdapter and only
> > implemented the bindView() Method. This method is called when I call
> > notifyDataSetChanged() on the RCAdapter. However the method is called
> with a
> > cursor that contains the stale data.
> >
> > Now there was a second gotcha from the presentation that I couldn't
> really
> > place. It was said that the data should be committed on the GUI thread
> too
> > (before calling notifyDataSetChanged()). I couldn't place it then, but I
> now
> > suspect that this may be the issue here. So the rule would be to do the
> > commit() on the Cursor on the UI thread?
> > I do the updates to the database using a Service. This Service runs in
> the
> > background, sometimes the app is in the foreground at the same time, but
> > most often not. So I don't see how I should commit something in a UI
> thread?
> > Is this the issue here? There are two different Cursors and I could only
> use
> > notifyDataSetChanged when it would be the same cursor, otherwise
> requery()
> > is correct?
> >
> > Is that it? Any ideas?
> >
> > Is somebody going to write a book "The Android SDK - The missing manual"?
> > ;-)
> >
> > Cheers,
> > Mariano
> >
> > [1]
> http://code.google.com/events/io/2010/sessions/world-of-listview-andr...
> > [2]
> http://developer.android.com/reference/android/widget/BaseAdapter.htm...()
>
> --
> 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]<android-developers%[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