All videos and slides from sessions during Google's I/O conference last May 2010 are available here.
I watched The world of ListView and Writing zippy Android apps. Below are the items that were most interesting to me. They are all Android performance related.
The world of ListView
- 9:15: A View in Android costs about one or 2K of RAM
- 16:55: Call notifyDataSetChanged() (from the UI thread) when something in your adapter has changed.
- 18:27: getItemViewType() is used to make sure convertView is of the correct type in getView().
- 19:06: Make sure getViewTypeCount never changes. Note that it doesn't hurt performance if you always return say 10 even if you only have 2 different view types returned by getItemViewType().
- 30:13: Shows how to create a custom list selector in xml.
- 40:40: android:smoothScrollbar to prevent scrollbar changing size. Especially useful for listviews with items of which height can differ greatly
- 41:00: Use fill_parent instead of wrap_content in a ListView
- 53:10: If refreshing the whole screen via notifyDataSetChanged() is too much of a performance hit, you can try to get the visible position and use getChildAt() to figure out what view to update. Example code for that is here.
- 53:50: Use inflate(item, parent, false) to prevent relative layout attributes being ignored in a listview.
In general: don't try to outsmart the ListView by building your own caching, nor depend in any way on the order of getView(position) getting called.
Writing zippy Android apps
Zippy means non-janky which means sluggish, slow etc.
- 08:00: example apk of how not to do things/see how stuff performs. Includes small Perl sqllite wrapper script to see how much is being read from sqlite
- 15:00: read/writes I/O on emulator is a lot faster than on a real device
- 19:00: An AsyncTask can get killed before it finishes, e.g if the user hits the Home key. If it's important that the task finishes, use IntentService.
- 24:15: Profiling/tracing apps 'adb shell am profile ...' with the TraceView tool.
- 47:00: handling rotation when you don't want to reload your heavy objects: usegetLastNonConfigurationInstance() and onRetainNonConfigurationInstance(). See the Android reference for more info.
- 51:00: Think about using files instead of sqlite (if you have limited structured data for example)