Re: [android-developers] For Google about BaseAdapter class
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
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
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
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
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
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
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
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
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
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