Romain, Fantastic, thanks for the help! I've had customers contact me over the months about force closes that I can never get to the bottom of. This likely has fixed the lingering issues. Great news! Thanks,
pawpaw17 On Oct 11, 2:08 pm, Romain Guy <romain...@google.com> wrote: > > In my background thread if I add < 100 elements to the array, > > everything works great. If > > I add more than 300 though I get the crash. Is this capacity related. > > No, this is related to the use of threads. Even adding 1 element could > cause the crash. You just cannot really predict the behavior. That's > why this exception was added, to help you write your apps correctly. > Otherwise your app would look like it's working except in some cases > bad things would happen (crash in the UI toolkit, surprising behavior > in the UI, etc.) > > > How are we supposed to populate an array list associated with an array > > adapter when we are > > grabbing stuff out of the database in a background thread? Do we just > > do the database read in > > the background and then process the results from the cursors in the UI > > thread? > > That's a possibility. You could also just use a CursorAdapter. You > could also use an AsyncTask and add new elements to the array using > publishProgress() every X elements processed. > > > > > > > > > Very best regards > > > pawpaw17 > > > in OnCreate... > > if (aa == null){ > > aa = new myArrayAdapter(this); > > } > > lList.setAdapter(aa); > > > Thread thread = new Thread(null, doSearchDatabase, > > "Background"); > > thread.start(); > > } > > > myArrayAdapter aa = null; > > final ArrayList<MyStats> myArrayList = new ArrayList<MyStats>(); > > > class myArrayAdapter extends ArrayAdapter { > > Activity context; > > myArrayAdapter(Activity context) { > > super(context, R.layout.caloriesrow, myArrayList); > > this.context=context; > > } > > > On Oct 11, 1:36 pm, Romain Guy <romain...@google.com> wrote: > >> --> myArrayList.add(i, new CalStats(name, extra, calories)); > > >> if that's the array list used by your adapter then you are modifying > >> it outside of the UI thread. > > >> On Sun, Oct 11, 2009 at 11:07 AM, ccfrazier2 <georgefraz...@yahoo.com> > >> wrote: > > >> > Yeah, it's the main thread of my app, here's the stack: > > >> > myApp [Android Application] > >> > myApp [Android Application] > >> > DalvikVM[localhost:8613] > >> > Thread [<3> main] (Suspended (exception > >> > IllegalStateException)) > >> > Thread [<15> Binder Thread #3] (Running) > >> > Thread [<13> Binder Thread #2] (Running) > >> > Thread [<11> Binder Thread #1] (Running) > > >> > Thread [<3> main] (Suspended (exception IllegalStateException)) > >> > ListView.layoutChildren() line: 1596 > >> > ListView(AbsListView).onLayout(boolean, int, int, int, int) line: > >> > 1112 > >> > ListView(View).layout(int, int, int, int) line: 6569 > >> > LinearLayout.setChildFrame(View, int, int, int, int) line: 1119 > >> > LinearLayout.layoutVertical() line: 998 > >> > LinearLayout.onLayout(boolean, int, int, int, int) line: 918 > >> > LinearLayout(View).layout(int, int, int, int) line: 6569 > >> > FrameLayout.onLayout(boolean, int, int, int, int) line: 333 > >> > FrameLayout(View).layout(int, int, int, int) line: 6569 > >> > LinearLayout.setChildFrame(View, int, int, int, int) line: 1119 > >> > LinearLayout.layoutVertical() line: 998 > >> > LinearLayout.onLayout(boolean, int, int, int, int) line: 918 > >> > LinearLayout(View).layout(int, int, int, int) line: 6569 > >> > PhoneWindow$DecorView(FrameLayout).onLayout(boolean, int, int, > >> > int, > >> > int) line: 333 > >> > PhoneWindow$DecorView(View).layout(int, int, int, int) line: 6569 > >> > ViewRoot.performTraversals() line: 979 > >> > ViewRoot.handleMessage(Message) line: 1613 > >> > ViewRoot(Handler).dispatchMessage(Message) line: 99 > >> > Looper.loop() line: 123 > >> > ActivityThread.main(String[]) line: 4203 > >> > Method.invokeNative(Object, Object[], Class, Class[], Class, int, > >> > boolean) line: not available [native method] > >> > Method.invoke(Object, Object...) line: 521 > >> > ZygoteInit$MethodAndArgsCaller.run() line: 791 > >> > ZygoteInit.main(String[]) line: 549 > >> > NativeStart.main(String[]) line: not available [native method] > > >> > None of my code in this stack. > > >> > Any thoughts on how to track this down? I'm sure I'm doing something > >> > wrong - but it was never a problem > >> > as far as I knew running with 1.5. > > >> > I spawn a thread at the end of "OnCreate" in my Activity that reads > >> > values from a database and populates > >> > the listView. The database reading is done in the worker thread, and I > >> > sort the list and tell the arrayadapter > >> > to notify tht the list has changed in a routine that gets called from > >> > my handler, ie I post at the end of the run > >> > method of the worker thread so I can notify the array adapter from the > >> > UI thread. > > >> > private void fillList(){ > >> > Collections.sort(myArrayList); > >> > // aa is an arrayAdapter > >> > aa.notifyDataSetChanged(); > >> > } > > >> > Thanks for any thoughts you guys have on this. > > >> > Very best, > > >> > pawpaw17 > > >> > On Oct 11, 10:20 am, RichardC <richard.crit...@googlemail.com> wrote: > >> >> When you get the error, can you see from the traceback which thread > >> >> you are in? > > >> >> -- > >> >> RichardC > > >> >> On Oct 11, 4:06 pm, ccfrazier2 <georgefraz...@yahoo.com> wrote: > > >> >> > Romain, > > >> >> > thanks for confirming that this message is new in 1.6. > > >> >> > Actually, I mean to write "I'm sure my adapter mods are IN the UI > >> >> > thread, not the background thread". Anything else that can cause this? > > >> >> > If I step through the code in the debugger I don't get the exception, > >> >> > but I I run without stepping I do. Also, when I run the phone on > >> >> > the app, I can get it to "work" 3 or 4 times, and then eventually I'll > >> >> > get the force close. > > >> >> > Can anything else cause this? > > >> >> > Here's my code in the background thread: > > >> >> > public void run(){ > >> >> > int i = 0; > >> >> > lsDb.openDataBase(); > >> >> > rescursor = lsDb.Search(); > >> >> > if (rescursor.getCount() > 0){ > >> >> > id_index = rescursor.getColumnIndex("_id"); > >> >> > name_index = rescursor.getColumnIndex("Name"); > >> >> > calories_index = > >> >> > rescursor.getColumnIndex("Calories"); > >> >> > extra_index = rescursor.getColumnIndex("sodium"); > >> >> > } > >> >> > if (rescursor.moveToFirst()){ > >> >> > do { > >> >> > int id = rescursor.getInt(id_index); > >> >> > String name = > >> >> > rescursor.getString(name_index); > >> >> > int calories = > >> >> > rescursor.getInt(calories_index); > >> >> > double extra= > >> >> > rescursor.getDouble(extra_index); > >> >> > // add > >> >> > to array list > >> >> > myArrayList.add(i, new CalStats(name, > >> >> > extra, calories)); > >> >> > i++; > >> >> > } > >> >> > while (rescursor.moveToNext()); > >> >> > } > >> >> > rescursor.close(); > >> >> > lsDb.close(); > >> >> > hh.post(postdoSearchDatabase); > >> >> > } > > >> >> > The "post" at the end is to a handler. I **do** modify the adapter in > >> >> > the run method there. > > >> >> > On Oct 11, 1:36 am, Romain Guy <romain...@google.com> wrote: > > >> >> > > It's not a bug, it's a message that was added to notify app > >> >> > > developers > >> >> > > of applications that are doing the wrong thing. > > >> >> > > > I'm sure my adapter mods are not in the UI thread. > > >> >> > > Which is exactly the problem. > > >> >> > > -- > >> >> > > 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- Hide > >> >> > > quoted text - > > >> >> - Show quoted text - > > >> -- > >> 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- Hide quoted > >> text - > > >> - Show quoted text - > > -- > 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- Hide quoted text - > > - Show quoted text - --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---