Re: [android-developers] For Google about BaseAdapter class

2010-11-16 Thread Julian
Hi,

I guess Robert is right since my code look like this (inside an
AsyncTask), but the exception appears from time to time, not always but
enought for being annoying.


int i=0;
do
{
Plan aux= new Plan((SoapObject)itemsSeccion.getProperty(i));
planes.add(aux);
publishProgress();
i++;
}while(i5);
..

@Override
protected void onProgressUpdate(Void... values)
{
arrayAdapter.notifyDataSetChanged();
}
...

So, is there any new advice for this?

Regards.

2009/11/20 Romain Guy romain...@google.com

 As soon as you change the count you must notifyDatasetChanged().

 On Fri, Nov 20, 2009 at 10:59 PM, Robert Woodruff woodman...@gmail.com
 wrote:
  Hi Romain,
 
 
 
  Thanks for the info. I think you are saying that the small example below,
  all of which runs on the UI thread, will cause the exception to be
 thrown?
  Right?
 
 
 
  1. Change the count in the base adapter
 
  2. notifyDataSetChanged() // Which captures a count and will react some
  time in the future
 
  3. Immediately change the count in the base adapter, again
 
 
 
  Even though the count is only ever changed in the UI thread? It may
 explain
  why the exception is being thrown in one of my apps by ListView even
 though
  the adapter count is only ever changed in the UI thread.
 
 
 
  Say there is a thread running, in an AsyncTask, gathering data to be
 placed
  in the adapter. It reaches a point to report that data is to be added to
 the
  Adapter. The AsyncTask.doInBackground() calls  publishProgress() which
  queues a Handler on the UI thread to eventually call onProgressUpdate().
 
 
 
  Eventually the onProgressUpdate() Handler runs on the UI thread and
 causes
  the adapter count to change. But notifyDataSetChanged() was called before
  the publishProgress () Handler runs and the Handler runs before the
 ListView
  Handler comes around to update the list. So ListView throws an exception
  because it sees a different count than when notifyDataSetChanged() was
  called. But the Adapter count was changed always on the UI thread.
 
 
 
  This brings back the question: When is it safe to change the count in a
  BaseAdapter()? It seems like there should be a semaphore or listener or
  something that says Now it is OK to change the count/Now it is NOT OK to
  change the count Or maybe notifyDataSetChanged() could tell the ListView
 it
  to suspend operations, update the count and continue operations.
 
 
 
  If I am not too far off base with this it would be good to know when it
 is
  safe to change the adapter count.
 
 
 
  Thank you,
 
  On Fri, Nov 20, 2009 at 4:14 PM, Romain Guy romain...@google.com
 wrote:
 
   1. Change the count in the base adapter
   2. notifyDataSetChanged() // Which will react some time in the future
   3. immediately change the count in the base adapter, again
 
   Or another way: when does the ListView grab the BaseAdapter count?
 Does
   it
   grab it on the call to notifyDataSetChanged() or whenever it later
   starts
   the update operation?
 
  It grabs it in notifyDatasetChanged(). Also, the count change must
  happen on the UI thread.
 
  
   Thank you,
  
   On Thu, Nov 19, 2009 at 2:24 PM, Dianne Hackborn hack...@android.com
 
   wrote:
  
   As the exception says:
  
   throw new IllegalStateException(The content of the
   adapter has changed but 
   + ListView did not receive a notification.
   Make
   sure the content of 
   + your adapter is not modified from a
   background
   thread, but only 
   + from the UI thread. [in ListView( +
 getId()
   +
   ,  + getClass()
   + ) with Adapter( + mAdapter.getClass() +
   )]);
  
   You can't modify an adapter from a background thread; this must be
 done
   on
   the main thread.
  
   This exception is not adding a restriction; it is making it more
   obvious
   when you do something that would always break in weird, subtle,
 and/or
   horrible ways.
  
   On Thu, Nov 19, 2009 at 5:56 AM, WoodManEXP woodman...@gmail.com
   wrote:
  
   For Google about BaseAdapter class
  
   In Android 1.6 and 2.0 the BaseAdapter class has apparently been
   modified to throw an exception when it sees the Adapter.getCount()
   method return a number different than what it picked up when
   BaseAdapter.notifyDataSetChanged() was called (at least I did not
   observe this behavior in pre 1.6).
  
   So now the question is, when should one call notifyDataSetChanged()
 or
   more importantly, when can the count in the Adapter be safely
 changed?
  
   Consider the case of an app with a background thread delivering data
   to a BaseAdapter at a rate faster than the ListView responds to
   notifyDataSetChanged(). Because notifyDataSetChanged() is a
   synchronous call and the ListView updates are taking place sometime
 in
   the indeterminate future on the UI thread, how can an app know when
 it
   is safe to change the adapter count?
  
   If the app changes 

Re: [android-developers] For Google about BaseAdapter class

2009-11-20 Thread Robert Woodruff
Dianne,

Let me ask this quick question.

Will this sequence of three operations, run consecutively one right after
the other on the UI thread, cause the exception to be thrown

1. Change the count in the base adapter
2. notifyDataSetChanged() // Which will react some time in the future
3. immediately change the count in the base adapter, again

Or another way: when does the ListView grab the BaseAdapter count? Does it
grab it on the call to notifyDataSetChanged() or whenever it later starts
the update operation?

Thank you,

On Thu, Nov 19, 2009 at 2:24 PM, Dianne Hackborn hack...@android.comwrote:

 As the exception says:

 throw new IllegalStateException(The content of the adapter
 has changed but 
 + ListView did not receive a notification. Make
 sure the content of 
 + your adapter is not modified from a background
 thread, but only 
 + from the UI thread. [in ListView( + getId() +
 ,  + getClass()
 + ) with Adapter( + mAdapter.getClass() + )]);

 You can't modify an adapter from a background thread; this must be done on
 the main thread.

 This exception is not adding a restriction; it is making it more obvious
 when you do something that would always break in weird, subtle, and/or
 horrible ways.

 On Thu, Nov 19, 2009 at 5:56 AM, WoodManEXP woodman...@gmail.com wrote:

 For Google about BaseAdapter class

 In Android 1.6 and 2.0 the BaseAdapter class has apparently been
 modified to throw an exception when it sees the Adapter.getCount()
 method return a number different than what it picked up when
 BaseAdapter.notifyDataSetChanged() was called (at least I did not
 observe this behavior in pre 1.6).

 So now the question is, when should one call notifyDataSetChanged() or
 more importantly, when can the count in the Adapter be safely changed?

 Consider the case of an app with a background thread delivering data
 to a BaseAdapter at a rate faster than the ListView responds to
 notifyDataSetChanged(). Because notifyDataSetChanged() is a
 synchronous call and the ListView updates are taking place sometime in
 the indeterminate future on the UI thread, how can an app know when it
 is safe to change the adapter count?

 If the app changes the count while the ListView is updating itself the
 exception will be thrown (and there is no way to catch the exception).

 Is there a way to know when it is safe to change the count in the
 BaseAdapter?

 --
 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.comandroid-developers%2bunsubscr...@googlegroups.com
 For more options, visit this group at
 http://groups.google.com/group/android-developers?hl=en




 --
 Dianne Hackborn
 Android framework engineer
 hack...@android.com

 Note: please don't send private questions to me, as I don't have time to
 provide private support, and so won't reply to such e-mails.  All such
 questions should be posted on public forums, where I and others can see and
 answer them.

  --
 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.comandroid-developers%2bunsubscr...@googlegroups.com
 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 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

Re: [android-developers] For Google about BaseAdapter class

2009-11-20 Thread Romain Guy
 1. Change the count in the base adapter
 2. notifyDataSetChanged() // Which will react some time in the future
 3. immediately change the count in the base adapter, again

 Or another way: when does the ListView grab the BaseAdapter count? Does it
 grab it on the call to notifyDataSetChanged() or whenever it later starts
 the update operation?

It grabs it in notifyDatasetChanged(). Also, the count change must
happen on the UI thread.


 Thank you,

 On Thu, Nov 19, 2009 at 2:24 PM, Dianne Hackborn hack...@android.com
 wrote:

 As the exception says:

     throw new IllegalStateException(The content of the
 adapter has changed but 
     + ListView did not receive a notification. Make
 sure the content of 
     + your adapter is not modified from a background
 thread, but only 
     + from the UI thread. [in ListView( + getId() +
 ,  + getClass()
     + ) with Adapter( + mAdapter.getClass() + )]);

 You can't modify an adapter from a background thread; this must be done on
 the main thread.

 This exception is not adding a restriction; it is making it more obvious
 when you do something that would always break in weird, subtle, and/or
 horrible ways.

 On Thu, Nov 19, 2009 at 5:56 AM, WoodManEXP woodman...@gmail.com wrote:

 For Google about BaseAdapter class

 In Android 1.6 and 2.0 the BaseAdapter class has apparently been
 modified to throw an exception when it sees the Adapter.getCount()
 method return a number different than what it picked up when
 BaseAdapter.notifyDataSetChanged() was called (at least I did not
 observe this behavior in pre 1.6).

 So now the question is, when should one call notifyDataSetChanged() or
 more importantly, when can the count in the Adapter be safely changed?

 Consider the case of an app with a background thread delivering data
 to a BaseAdapter at a rate faster than the ListView responds to
 notifyDataSetChanged(). Because notifyDataSetChanged() is a
 synchronous call and the ListView updates are taking place sometime in
 the indeterminate future on the UI thread, how can an app know when it
 is safe to change the adapter count?

 If the app changes the count while the ListView is updating itself the
 exception will be thrown (and there is no way to catch the exception).

 Is there a way to know when it is safe to change the count in the
 BaseAdapter?

 --
 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



 --
 Dianne Hackborn
 Android framework engineer
 hack...@android.com

 Note: please don't send private questions to me, as I don't have time to
 provide private support, and so won't reply to such e-mails.  All such
 questions should be posted on public forums, where I and others can see and
 answer them.

 --
 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

 --
 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



-- 
Romain Guy
Android framework engineer
romain...@android.com

Note: please don't send private questions to me, as I don't have time
to provide private support.  All such questions should be posted on
public forums, where I and others can see and answer them

-- 
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


Re: [android-developers] For Google about BaseAdapter class

2009-11-20 Thread Robert Woodruff
Hi Romain,



Thanks for the info. I think you are saying that the small example below,
all of which runs on the UI thread, will cause the exception to be thrown?
Right?



 1. Change the count in the base adapter

 2. notifyDataSetChanged() // Which captures a count and will react some
time in the future

 3. Immediately change the count in the base adapter, again



Even though the count is only ever changed in the UI thread? It may explain
why the exception is being thrown in one of my apps by ListView even though
the adapter count is only ever changed in the UI thread.



Say there is a thread running, in an AsyncTask, gathering data to be placed
in the adapter. It reaches a point to report that data is to be added to the
Adapter. The AsyncTask.doInBackground() calls  publishProgress() which
queues a Handler on the UI thread to eventually call onProgressUpdate().



Eventually the onProgressUpdate() Handler runs on the UI thread and causes
the adapter count to change. But notifyDataSetChanged() was called before
the publishProgress () Handler runs and the Handler runs before the ListView
Handler comes around to update the list. So ListView throws an exception
because it sees a different count than when notifyDataSetChanged() was
called. But the Adapter count was changed always on the UI thread.



This brings back the question: When is it safe to change the count in a
BaseAdapter()? It seems like there should be a semaphore or listener or
something that says Now it is OK to change the count/Now it is NOT OK to
change the count Or maybe notifyDataSetChanged() could tell the ListView it
to suspend operations, update the count and continue operations.



If I am not too far off base with this it would be good to know when it is
safe to change the adapter count.



Thank you,


On Fri, Nov 20, 2009 at 4:14 PM, Romain Guy romain...@google.com wrote:

  1. Change the count in the base adapter
  2. notifyDataSetChanged() // Which will react some time in the future
  3. immediately change the count in the base adapter, again

  Or another way: when does the ListView grab the BaseAdapter count? Does
 it
  grab it on the call to notifyDataSetChanged() or whenever it later starts
  the update operation?

 It grabs it in notifyDatasetChanged(). Also, the count change must
 happen on the UI thread.

 
  Thank you,
 
  On Thu, Nov 19, 2009 at 2:24 PM, Dianne Hackborn hack...@android.com
  wrote:
 
  As the exception says:
 
  throw new IllegalStateException(The content of the
  adapter has changed but 
  + ListView did not receive a notification. Make
  sure the content of 
  + your adapter is not modified from a
 background
  thread, but only 
  + from the UI thread. [in ListView( + getId()
 +
  ,  + getClass()
  + ) with Adapter( + mAdapter.getClass() +
 )]);
 
  You can't modify an adapter from a background thread; this must be done
 on
  the main thread.
 
  This exception is not adding a restriction; it is making it more obvious
  when you do something that would always break in weird, subtle, and/or
  horrible ways.
 
  On Thu, Nov 19, 2009 at 5:56 AM, WoodManEXP woodman...@gmail.com
 wrote:
 
  For Google about BaseAdapter class
 
  In Android 1.6 and 2.0 the BaseAdapter class has apparently been
  modified to throw an exception when it sees the Adapter.getCount()
  method return a number different than what it picked up when
  BaseAdapter.notifyDataSetChanged() was called (at least I did not
  observe this behavior in pre 1.6).
 
  So now the question is, when should one call notifyDataSetChanged() or
  more importantly, when can the count in the Adapter be safely changed?
 
  Consider the case of an app with a background thread delivering data
  to a BaseAdapter at a rate faster than the ListView responds to
  notifyDataSetChanged(). Because notifyDataSetChanged() is a
  synchronous call and the ListView updates are taking place sometime in
  the indeterminate future on the UI thread, how can an app know when it
  is safe to change the adapter count?
 
  If the app changes the count while the ListView is updating itself the
  exception will be thrown (and there is no way to catch the exception).
 
  Is there a way to know when it is safe to change the count in the
  BaseAdapter?
 
  --
  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.comandroid-developers%2bunsubscr...@googlegroups.com
  For more options, visit this group at
  http://groups.google.com/group/android-developers?hl=en
 
 
 
  --
  Dianne Hackborn
  Android framework engineer
  hack...@android.com
 
  Note: please don't send private questions to me, as I don't have time to
  provide private support, and so won't 

Re: [android-developers] For Google about BaseAdapter class

2009-11-20 Thread Romain Guy
As soon as you change the count you must notifyDatasetChanged().

On Fri, Nov 20, 2009 at 10:59 PM, Robert Woodruff woodman...@gmail.com wrote:
 Hi Romain,



 Thanks for the info. I think you are saying that the small example below,
 all of which runs on the UI thread, will cause the exception to be thrown?
 Right?



 1. Change the count in the base adapter

 2. notifyDataSetChanged() // Which captures a count and will react some
 time in the future

 3. Immediately change the count in the base adapter, again



 Even though the count is only ever changed in the UI thread? It may explain
 why the exception is being thrown in one of my apps by ListView even though
 the adapter count is only ever changed in the UI thread.



 Say there is a thread running, in an AsyncTask, gathering data to be placed
 in the adapter. It reaches a point to report that data is to be added to the
 Adapter. The AsyncTask.doInBackground() calls  publishProgress() which
 queues a Handler on the UI thread to eventually call onProgressUpdate().



 Eventually the onProgressUpdate() Handler runs on the UI thread and causes
 the adapter count to change. But notifyDataSetChanged() was called before
 the publishProgress () Handler runs and the Handler runs before the ListView
 Handler comes around to update the list. So ListView throws an exception
 because it sees a different count than when notifyDataSetChanged() was
 called. But the Adapter count was changed always on the UI thread.



 This brings back the question: When is it safe to change the count in a
 BaseAdapter()? It seems like there should be a semaphore or listener or
 something that says Now it is OK to change the count/Now it is NOT OK to
 change the count Or maybe notifyDataSetChanged() could tell the ListView it
 to suspend operations, update the count and continue operations.



 If I am not too far off base with this it would be good to know when it is
 safe to change the adapter count.



 Thank you,

 On Fri, Nov 20, 2009 at 4:14 PM, Romain Guy romain...@google.com wrote:

  1. Change the count in the base adapter
  2. notifyDataSetChanged() // Which will react some time in the future
  3. immediately change the count in the base adapter, again

  Or another way: when does the ListView grab the BaseAdapter count? Does
  it
  grab it on the call to notifyDataSetChanged() or whenever it later
  starts
  the update operation?

 It grabs it in notifyDatasetChanged(). Also, the count change must
 happen on the UI thread.

 
  Thank you,
 
  On Thu, Nov 19, 2009 at 2:24 PM, Dianne Hackborn hack...@android.com
  wrote:
 
  As the exception says:
 
      throw new IllegalStateException(The content of the
  adapter has changed but 
      + ListView did not receive a notification.
  Make
  sure the content of 
      + your adapter is not modified from a
  background
  thread, but only 
      + from the UI thread. [in ListView( + getId()
  +
  ,  + getClass()
      + ) with Adapter( + mAdapter.getClass() +
  )]);
 
  You can't modify an adapter from a background thread; this must be done
  on
  the main thread.
 
  This exception is not adding a restriction; it is making it more
  obvious
  when you do something that would always break in weird, subtle, and/or
  horrible ways.
 
  On Thu, Nov 19, 2009 at 5:56 AM, WoodManEXP woodman...@gmail.com
  wrote:
 
  For Google about BaseAdapter class
 
  In Android 1.6 and 2.0 the BaseAdapter class has apparently been
  modified to throw an exception when it sees the Adapter.getCount()
  method return a number different than what it picked up when
  BaseAdapter.notifyDataSetChanged() was called (at least I did not
  observe this behavior in pre 1.6).
 
  So now the question is, when should one call notifyDataSetChanged() or
  more importantly, when can the count in the Adapter be safely changed?
 
  Consider the case of an app with a background thread delivering data
  to a BaseAdapter at a rate faster than the ListView responds to
  notifyDataSetChanged(). Because notifyDataSetChanged() is a
  synchronous call and the ListView updates are taking place sometime in
  the indeterminate future on the UI thread, how can an app know when it
  is safe to change the adapter count?
 
  If the app changes the count while the ListView is updating itself the
  exception will be thrown (and there is no way to catch the exception).
 
  Is there a way to know when it is safe to change the count in the
  BaseAdapter?
 
  --
  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
 
 
 
  --
  Dianne Hackborn
  Android framework engineer
  

[android-developers] For Google about BaseAdapter class

2009-11-19 Thread WoodManEXP
For Google about BaseAdapter class

In Android 1.6 and 2.0 the BaseAdapter class has apparently been
modified to throw an exception when it sees the Adapter.getCount()
method return a number different than what it picked up when
BaseAdapter.notifyDataSetChanged() was called (at least I did not
observe this behavior in pre 1.6).

So now the question is, when should one call notifyDataSetChanged() or
more importantly, when can the count in the Adapter be safely changed?

Consider the case of an app with a background thread delivering data
to a BaseAdapter at a rate faster than the ListView responds to
notifyDataSetChanged(). Because notifyDataSetChanged() is a
synchronous call and the ListView updates are taking place sometime in
the indeterminate future on the UI thread, how can an app know when it
is safe to change the adapter count?

If the app changes the count while the ListView is updating itself the
exception will be thrown (and there is no way to catch the exception).

Is there a way to know when it is safe to change the count in the
BaseAdapter?

-- 
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


Re: [android-developers] For Google about BaseAdapter class

2009-11-19 Thread Dianne Hackborn
As the exception says:

throw new IllegalStateException(The content of the adapter
has changed but 
+ ListView did not receive a notification. Make
sure the content of 
+ your adapter is not modified from a background
thread, but only 
+ from the UI thread. [in ListView( + getId() + ,
 + getClass()
+ ) with Adapter( + mAdapter.getClass() + )]);

You can't modify an adapter from a background thread; this must be done on
the main thread.

This exception is not adding a restriction; it is making it more obvious
when you do something that would always break in weird, subtle, and/or
horrible ways.

On Thu, Nov 19, 2009 at 5:56 AM, WoodManEXP woodman...@gmail.com wrote:

 For Google about BaseAdapter class

 In Android 1.6 and 2.0 the BaseAdapter class has apparently been
 modified to throw an exception when it sees the Adapter.getCount()
 method return a number different than what it picked up when
 BaseAdapter.notifyDataSetChanged() was called (at least I did not
 observe this behavior in pre 1.6).

 So now the question is, when should one call notifyDataSetChanged() or
 more importantly, when can the count in the Adapter be safely changed?

 Consider the case of an app with a background thread delivering data
 to a BaseAdapter at a rate faster than the ListView responds to
 notifyDataSetChanged(). Because notifyDataSetChanged() is a
 synchronous call and the ListView updates are taking place sometime in
 the indeterminate future on the UI thread, how can an app know when it
 is safe to change the adapter count?

 If the app changes the count while the ListView is updating itself the
 exception will be thrown (and there is no way to catch the exception).

 Is there a way to know when it is safe to change the count in the
 BaseAdapter?

 --
 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.comandroid-developers%2bunsubscr...@googlegroups.com
 For more options, visit this group at
 http://groups.google.com/group/android-developers?hl=en




-- 
Dianne Hackborn
Android framework engineer
hack...@android.com

Note: please don't send private questions to me, as I don't have time to
provide private support, and so won't reply to such e-mails.  All such
questions should be posted on public forums, where I and others can see and
answer them.

-- 
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

Re: [android-developers] For Google about BaseAdapter class

2009-11-19 Thread Robert Woodruff
Dianne,

Thanks so much for responding.

Let me ask, to be sure. Does the ListView do its updating on the UI thread?
I ask becasue it seems the call to BaseAdapter.notifyDataSetChanged() is
synchronous (so it could be spawning another thread to do the work).

I am pretty sure the adapter in this app is not being modified outside of
the UI thread but I can cause the exception to be thrown.

Thanks,

On Thu, Nov 19, 2009 at 2:24 PM, Dianne Hackborn hack...@android.comwrote:

 As the exception says:

 throw new IllegalStateException(The content of the adapter
 has changed but 
 + ListView did not receive a notification. Make
 sure the content of 
 + your adapter is not modified from a background
 thread, but only 
 + from the UI thread. [in ListView( + getId() +
 ,  + getClass()
 + ) with Adapter( + mAdapter.getClass() + )]);

 You can't modify an adapter from a background thread; this must be done on
 the main thread.

 This exception is not adding a restriction; it is making it more obvious
 when you do something that would always break in weird, subtle, and/or
 horrible ways.

 On Thu, Nov 19, 2009 at 5:56 AM, WoodManEXP woodman...@gmail.com wrote:

 For Google about BaseAdapter class

 In Android 1.6 and 2.0 the BaseAdapter class has apparently been
 modified to throw an exception when it sees the Adapter.getCount()
 method return a number different than what it picked up when
 BaseAdapter.notifyDataSetChanged() was called (at least I did not
 observe this behavior in pre 1.6).

 So now the question is, when should one call notifyDataSetChanged() or
 more importantly, when can the count in the Adapter be safely changed?

 Consider the case of an app with a background thread delivering data
 to a BaseAdapter at a rate faster than the ListView responds to
 notifyDataSetChanged(). Because notifyDataSetChanged() is a
 synchronous call and the ListView updates are taking place sometime in
 the indeterminate future on the UI thread, how can an app know when it
 is safe to change the adapter count?

 If the app changes the count while the ListView is updating itself the
 exception will be thrown (and there is no way to catch the exception).

 Is there a way to know when it is safe to change the count in the
 BaseAdapter?

 --
 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.comandroid-developers%2bunsubscr...@googlegroups.com
 For more options, visit this group at
 http://groups.google.com/group/android-developers?hl=en




 --
 Dianne Hackborn
 Android framework engineer
 hack...@android.com

 Note: please don't send private questions to me, as I don't have time to
 provide private support, and so won't reply to such e-mails.  All such
 questions should be posted on public forums, where I and others can see and
 answer them.

  --
 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.comandroid-developers%2bunsubscr...@googlegroups.com
 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 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

Re: [android-developers] For Google about BaseAdapter class

2009-11-19 Thread Romain Guy
ListView does everything on the UI thrad.

 I am pretty sure the adapter in this app is not being modified outside of
 the UI thread but I can cause the exception to be thrown.

Modifying the data structure(s) that backs the adapter on a background
thread could cause this.


 Thanks,

 On Thu, Nov 19, 2009 at 2:24 PM, Dianne Hackborn hack...@android.com
 wrote:

 As the exception says:

     throw new IllegalStateException(The content of the
 adapter has changed but 
     + ListView did not receive a notification. Make
 sure the content of 
     + your adapter is not modified from a background
 thread, but only 
     + from the UI thread. [in ListView( + getId() +
 ,  + getClass()
     + ) with Adapter( + mAdapter.getClass() + )]);

 You can't modify an adapter from a background thread; this must be done on
 the main thread.

 This exception is not adding a restriction; it is making it more obvious
 when you do something that would always break in weird, subtle, and/or
 horrible ways.

 On Thu, Nov 19, 2009 at 5:56 AM, WoodManEXP woodman...@gmail.com wrote:

 For Google about BaseAdapter class

 In Android 1.6 and 2.0 the BaseAdapter class has apparently been
 modified to throw an exception when it sees the Adapter.getCount()
 method return a number different than what it picked up when
 BaseAdapter.notifyDataSetChanged() was called (at least I did not
 observe this behavior in pre 1.6).

 So now the question is, when should one call notifyDataSetChanged() or
 more importantly, when can the count in the Adapter be safely changed?

 Consider the case of an app with a background thread delivering data
 to a BaseAdapter at a rate faster than the ListView responds to
 notifyDataSetChanged(). Because notifyDataSetChanged() is a
 synchronous call and the ListView updates are taking place sometime in
 the indeterminate future on the UI thread, how can an app know when it
 is safe to change the adapter count?

 If the app changes the count while the ListView is updating itself the
 exception will be thrown (and there is no way to catch the exception).

 Is there a way to know when it is safe to change the count in the
 BaseAdapter?

 --
 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



 --
 Dianne Hackborn
 Android framework engineer
 hack...@android.com

 Note: please don't send private questions to me, as I don't have time to
 provide private support, and so won't reply to such e-mails.  All such
 questions should be posted on public forums, where I and others can see and
 answer them.

 --
 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

 --
 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



-- 
Romain Guy
Android framework engineer
romain...@android.com

Note: please don't send private questions to me, as I don't have time
to provide private support.  All such questions should be posted on
public forums, where I and others can see and answer them

-- 
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


Re: [android-developers] For Google about BaseAdapter class

2009-11-19 Thread Robert Woodruff
Thanks all for responding. This has been most helpful!

On Thu, Nov 19, 2009 at 8:49 PM, Romain Guy romain...@google.com wrote:

 ListView does everything on the UI thrad.

  I am pretty sure the adapter in this app is not being modified outside of
  the UI thread but I can cause the exception to be thrown.

 Modifying the data structure(s) that backs the adapter on a background
 thread could cause this.

 
  Thanks,
 
  On Thu, Nov 19, 2009 at 2:24 PM, Dianne Hackborn hack...@android.com
  wrote:
 
  As the exception says:
 
  throw new IllegalStateException(The content of the
  adapter has changed but 
  + ListView did not receive a notification. Make
  sure the content of 
  + your adapter is not modified from a
 background
  thread, but only 
  + from the UI thread. [in ListView( + getId()
 +
  ,  + getClass()
  + ) with Adapter( + mAdapter.getClass() +
 )]);
 
  You can't modify an adapter from a background thread; this must be done
 on
  the main thread.
 
  This exception is not adding a restriction; it is making it more obvious
  when you do something that would always break in weird, subtle, and/or
  horrible ways.
 
  On Thu, Nov 19, 2009 at 5:56 AM, WoodManEXP woodman...@gmail.com
 wrote:
 
  For Google about BaseAdapter class
 
  In Android 1.6 and 2.0 the BaseAdapter class has apparently been
  modified to throw an exception when it sees the Adapter.getCount()
  method return a number different than what it picked up when
  BaseAdapter.notifyDataSetChanged() was called (at least I did not
  observe this behavior in pre 1.6).
 
  So now the question is, when should one call notifyDataSetChanged() or
  more importantly, when can the count in the Adapter be safely changed?
 
  Consider the case of an app with a background thread delivering data
  to a BaseAdapter at a rate faster than the ListView responds to
  notifyDataSetChanged(). Because notifyDataSetChanged() is a
  synchronous call and the ListView updates are taking place sometime in
  the indeterminate future on the UI thread, how can an app know when it
  is safe to change the adapter count?
 
  If the app changes the count while the ListView is updating itself the
  exception will be thrown (and there is no way to catch the exception).
 
  Is there a way to know when it is safe to change the count in the
  BaseAdapter?
 
  --
  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.comandroid-developers%2bunsubscr...@googlegroups.com
  For more options, visit this group at
  http://groups.google.com/group/android-developers?hl=en
 
 
 
  --
  Dianne Hackborn
  Android framework engineer
  hack...@android.com
 
  Note: please don't send private questions to me, as I don't have time to
  provide private support, and so won't reply to such e-mails.  All such
  questions should be posted on public forums, where I and others can see
 and
  answer them.
 
  --
  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.comandroid-developers%2bunsubscr...@googlegroups.com
  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 android-developers@googlegroups.com
  To unsubscribe from this group, send email to
  android-developers+unsubscr...@googlegroups.comandroid-developers%2bunsubscr...@googlegroups.com
  For more options, visit this group at
  http://groups.google.com/group/android-developers?hl=en



 --
 Romain Guy
 Android framework engineer
 romain...@android.com

 Note: please don't send private questions to me, as I don't have time
 to provide private support.  All such questions should be posted on
 public forums, where I and others can see and answer them

 --
 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.comandroid-developers%2bunsubscr...@googlegroups.com
 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 android-developers@googlegroups.com
To unsubscribe from this group, send email to