Android UI Development:
Tips, Tricks, and Techniques
                      Romain Guy
                       Chet Haase
           Android UI Toolkit Team
                           Google
Android UI Development:
          rrific Tips,Tricks, and Techniques
    lly Te
Tota
                                      Romain Guy
                                       Chet Haase
                           Android UI Toolkit Team
                                           Google
Trash Talk
Trash Talk
            or
Garbage Zero
  Avoid creating garbage,
when necessary and possible
Statics as Temporaries
• Instead of a temporary object:
    public boolean pointInArea(int x, int y, Area area) {
      Point testPoint = new Point(x, y);
      return area.intersect(testPoint);
    }


• Consider a static instead:
    static final Point tmpPoint = new Point();

    public boolean pointInArea(int x, int y, Area area) {
      tmpPoint.x = x;
      tmpPoint.y = y;
      return area.intersect(tmpPoint.yPoint);
    }


                                                       5
AutoBoxing
• Autoboxing creates Objects

     float x = 5;
     Float y = x;
     doSomething(x);

     void doSomething(Float z) {}



                       is equivalent to
     float x = 5;
     Float y = new Float(x);
     doSomething(new Float(x));

     void doSomething(Float z) {}


                                          6
De-Autoboxing
• Use primitive types whenever possible
 –Avoids Object creation
• Use types you need for the situation
 –Avoids autoboxing back and forth




                                          7
Obliterator
• The enhanced for() loop is great
• ... but creates garbage
          for (Node node : nodeList) {}


               is equivalent to
          Iterator iter = nodeList.iterator();
          while (iter.hasNext()) {}


• Consider a size check first:
          if (nodeList.size() > 0) {
            for (Node node : nodeList) {}
          }


                                                 8
Image is Everything
• Recycle those Bitmaps
  –Device resources are limited
• Finalizers will clear them ... eventually
• You might think this would help
         // done using this one, clear reference
         myBitmap = null;

• But you really want to do this
         // done using this one, recycle it
         myBitmap.recycle();

• Don’t wait for the finalizer to do the work if you
  need that memory now

                                                   9
Varargh
• Parameters to varargs method packaged into a
  temporary array
       void someMethod(float... args) {}

       someMethod(5f);


               is equivalent to
       someMethod(new float[]{5});




                                           10
Gener-ick
• T doesn’t stand for “primitive Type”
             public class MyClass<T> {
               T myVar;
               MyClass<T>(T arg) {
                 myVar = arg;
               }
             }

• Generics only deal with Objects; primitive types
  get autoboxed
            float f;
            MyClass<Float> myObject =
              new MyClass<Float>(f);

            which is equivalent to
            MyClass<Float> myObject =
              new MyClass<Float>(new Float(f));
                                                  11
Tools: Allocation Tracking
• Limit allocations to find problems
        int prevLimt = -1;
        try {
          prevLimit =
        Debug.setAllocationLimit(0);
          // Do stuff
        } finally {
          Debug.setAllocationLimit(-1);
        }

• Count the allocations being made
        Debug.startAllocationCounting();
        // do stuff
        int allocCount = Debug.getThreadAllocCount();
        Debug.stopAllocationCounting);



                                                        12
Tools: DDMS
• Visual tool helps track allocations down to the
  object/file/line number
• (demo)




                                           13
Watch the Garbage...
But Don’t Be Silly
• As Michael Abrash might have said:
                                 ViewRoot
 –“Premature optimization is the Root of all evil”


• Minor garbage is irrelevant in most cases
• But if you have GCs at critical points in your
  application, consider Garbage Zero
 –Example: animations

                                                 14
Tools: hat
• DDMS
• Heap Analysis Tool is used to track down
  memory leaks
• adb shell dumpsys meminfo <process>




                                         15
Memory leaks
• Be careful with Context
• Be careful with static fields
• Avoid non-static inner classes
• Use weak references




                                   16
YOU and I
Responsiveness
• Single-threaded UI
• Don’t block the UI thread
 – Also called main thread
• AsyncTask
 – Worker thread and UI thread messaging
• Handler
 – Messaging




                                           18
Overinvalidating
• Only redraw what you must
• (demo)




                              19
Fewer is better
• Many views
 – Slower layout
 – Slower drawing
 – Slower startup time
• Deep hierarchies
 – Memory
 – Slow...
 – StackOverflowException



                            20
HiearchyViewer
Layout optimizations
• Custom views
• Custom layouts
• <merge />
• ViewStub
• Compound drawables
• layoutopt




                       22
ViewStub




           23
ViewStub




           24
ViewStub

   <ViewStub
       android:id="@+id/stub_import"
       android:inflatedId="@+id/panel_import"

       android:layout="@layout/progress_overlay"

       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_gravity="bottom" />




                                                25
ViewStub



findViewById(R.id.stub_import).setVisibility(View.VISIBLE);
// or
View importPanel = ((ViewStub)
        findViewById(R.id.stub_import)).inflate();




                                                  26
<merge/>




           27
<merge/>



<!-- The merge tag must be the root tag -->
<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Content -->
</merge>




                                                        28
Compound drawables
   <LinearLayout
       android:orientation="horizontal"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content">

       <ImageView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:src="@drawable/icon" />
       <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@string/hello" />

   </LinearLayout>

                                               29
Compound drawables


   <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/hello"
       android:drawableLeft="@drawable/icon" />




                                                  30
layoutopt
ListView


  1 public View getView(int position, View convertView, ViewGroup parent) {
  2     View item = mInflater.inflate(R.layout.list_item_icon_text, null);

  3     ((TextView) item.findViewById(R.id.text)).setText(DATA[position]);
  4     ((ImageView) item.findViewById(R.id.icon)).setImageBitmap(
  5             (position & 1) == 1 ? mIcon1 : mIcon2);

  6     return item;
  7 }




                                                                32
ListView


1 public View getView(int position, View convertView, ViewGroup parent) {
2     if (convertView == null) {
3         convertView = mInflater.inflate(R.layout.item, parent, false);
4     }

5     ((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]);
6     ((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap(
7             (position & 1) == 1 ? mIcon1 : mIcon2);

8     return convertView;
9 }




                                                                 33
ListView


           static class ViewHolder {
               TextView text;
               ImageView icon;
           }




                                       34
ListView
  1 public View getView(int position, View convertView, ViewGroup parent) {
  2     ViewHolder holder;
  3
  4     if (convertView == null) {
  5         convertView = mInflater.inflate(R.layout.list_item_icon_text,
  6                 parent, false);
  7         holder = new ViewHolder();
  8         holder.text = (TextView) convertView.findViewById(R.id.text);
  9         holder.icon = (ImageView) convertView.findViewById(R.id.icon);
 10
 11         convertView.setTag(holder);
 12     } else {
 13         holder = (ViewHolder) convertView.getTag();
 14     }
 15
 16     holder.text.setText(DATA[position]);
 17     holder.icon.setImageBitmap((position & 1) ==? mIcon1 : mIcon2);
 18
 19     return convertView;
 20 }

                                                                35
ListView
   60.0

   50.0

   40.0

   30.0

   20.0

   10.0

     0
            Dumb             Correct            Fast
           List of 10,000 items on NexusOne, Android 2.2
                                                       36
Graphics optimizations
• Pre-scale bitmaps
• Use compatible bitmaps
 – ARGB_8888 to draw on 32 bits window
• Avoid blending
• Use View drawing caches
 – View.setDrawingCacheEnabled(true)
• View.isOpaque()



                                         37
For More Information
• Android developer site
 –developer.android.com
• Romain
 –@romainguy
 –curious-creature.org
• Chet
 –@chethaase
 –graphics-geek.blogspot.com



                               38

More Related Content

PPTX
Get started with YUI
PPT
6.1.1一步一步学repast代码解释
PDF
响应式编程及框架
PPTX
YUI Tidbits
PDF
Advanced Object-Oriented JavaScript
KEY
Objective-Cひとめぐり
PDF
Sceneform SDK на практиці - UA Mobile 2019
PDF
Низкоуровневые оптимизации .NET-приложений
Get started with YUI
6.1.1一步一步学repast代码解释
响应式编程及框架
YUI Tidbits
Advanced Object-Oriented JavaScript
Objective-Cひとめぐり
Sceneform SDK на практиці - UA Mobile 2019
Низкоуровневые оптимизации .NET-приложений

What's hot (19)

PDF
[Let'Swift 2019] 실용적인 함수형 프로그래밍 워크샵
PDF
The Evolution of Async-Programming (SD 2.0, JavaScript)
PDF
Jscex: Write Sexy JavaScript (中文)
PDF
Jscex: Write Sexy JavaScript
KEY
みゆっき☆Think#7 「本気で学ぶJavascript」
KEY
openFrameworks 007 - utils
PDF
미려한 UI/UX를 위한 여정
PDF
오브젝트C(pdf)
PDF
深入浅出Jscex
PDF
Functional microscope - Lenses in C++
PDF
Object Oriented JavaScript
PDF
Real world cats
KEY
openFrameworks 007 - GL
PDF
Functional "Life": parallel cellular automata and comonads
PDF
Responsible JavaScript
PPTX
Awesomeness of JavaScript…almost
PDF
Google Guava - Core libraries for Java & Android
PPTX
JavaScript - i och utanför webbläsaren (2010-03-03)
KEY
Objective-C Crash Course for Web Developers
[Let'Swift 2019] 실용적인 함수형 프로그래밍 워크샵
The Evolution of Async-Programming (SD 2.0, JavaScript)
Jscex: Write Sexy JavaScript (中文)
Jscex: Write Sexy JavaScript
みゆっき☆Think#7 「本気で学ぶJavascript」
openFrameworks 007 - utils
미려한 UI/UX를 위한 여정
오브젝트C(pdf)
深入浅出Jscex
Functional microscope - Lenses in C++
Object Oriented JavaScript
Real world cats
openFrameworks 007 - GL
Functional "Life": parallel cellular automata and comonads
Responsible JavaScript
Awesomeness of JavaScript…almost
Google Guava - Core libraries for Java & Android
JavaScript - i och utanför webbläsaren (2010-03-03)
Objective-C Crash Course for Web Developers
Ad

Viewers also liked (20)

PPTX
Camera shots
PDF
Pure fast001
PPTX
Use power point
PDF
Mark Davis
PPT
Materials and properties
PDF
Making The Transition
PDF
SMCMUC Social CRM
PPTX
А что будет с командой? (Yandex & SPB Software)
PDF
Science item collection
PDF
Finn-ID RFID-kiertueella 2010: case Honkarakenne
PPTX
Angle shots
PPT
Sn i sentits EAT (2016)
PPTX
Location shots
PDF
Oltre l'orientamento
PPTX
Making Smart Choices: Data-Driven Decision Making in Academic Libraries
PPT
罗兰贝格战略采购报告(Ppt 112)
PPT
Funda gürbüz(twitter)
PPTX
Mongols ballad
PPTX
Standard procedure for selecting hospitality industry employees
Camera shots
Pure fast001
Use power point
Mark Davis
Materials and properties
Making The Transition
SMCMUC Social CRM
А что будет с командой? (Yandex & SPB Software)
Science item collection
Finn-ID RFID-kiertueella 2010: case Honkarakenne
Angle shots
Sn i sentits EAT (2016)
Location shots
Oltre l'orientamento
Making Smart Choices: Data-Driven Decision Making in Academic Libraries
罗兰贝格战略采购报告(Ppt 112)
Funda gürbüz(twitter)
Mongols ballad
Standard procedure for selecting hospitality industry employees
Ad

Similar to Android UI Development: Tips, Tricks, and Techniques (20)

PDF
Th 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficient
PDF
The Good, the Bad and the Ugly things to do with android
PDF
Android development first steps
PDF
Ask the expert - App performance on Series 40 phones
PPTX
Сергей Жук "Android Performance Tips & Tricks"
PPTX
Android Performance Tips & Tricks
PPT
Android Introduction
PDF
Study Jam: Android for Beginners, Summary
PDF
Introduction to Honeycomb APIs - Android Developer Lab 2011 Q3
PDF
[1D6]RE-view of Android L developer PRE-view
PPTX
Building your first android app using xamarin (Gill Cleeren)
PPTX
Building your first android app using Xamarin
PPT
Hello Android
PPTX
Building Large Sustainable Apps
PPT
Android Ui
PPT
Android UI
PDF
Graphicsand animations devoxx2010 (1)
PPTX
Best practices android_2010
PPT
Android ListView and Custom ListView
PPTX
Fernando F. Gallego - Efficient Android Resources 101
Th 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficient
The Good, the Bad and the Ugly things to do with android
Android development first steps
Ask the expert - App performance on Series 40 phones
Сергей Жук "Android Performance Tips & Tricks"
Android Performance Tips & Tricks
Android Introduction
Study Jam: Android for Beginners, Summary
Introduction to Honeycomb APIs - Android Developer Lab 2011 Q3
[1D6]RE-view of Android L developer PRE-view
Building your first android app using xamarin (Gill Cleeren)
Building your first android app using Xamarin
Hello Android
Building Large Sustainable Apps
Android Ui
Android UI
Graphicsand animations devoxx2010 (1)
Best practices android_2010
Android ListView and Custom ListView
Fernando F. Gallego - Efficient Android Resources 101

Recently uploaded (20)

PDF
Enhancing emotion recognition model for a student engagement use case through...
PPTX
Web Crawler for Trend Tracking Gen Z Insights.pptx
PDF
sustainability-14-14877-v2.pddhzftheheeeee
PPTX
The various Industrial Revolutions .pptx
PPTX
Chapter 5: Probability Theory and Statistics
PPTX
MicrosoftCybserSecurityReferenceArchitecture-April-2025.pptx
PDF
Architecture types and enterprise applications.pdf
PDF
Unlock new opportunities with location data.pdf
PPTX
Final SEM Unit 1 for mit wpu at pune .pptx
PDF
A comparative study of natural language inference in Swahili using monolingua...
PDF
Getting started with AI Agents and Multi-Agent Systems
PDF
Univ-Connecticut-ChatGPT-Presentaion.pdf
PDF
Zenith AI: Advanced Artificial Intelligence
PDF
Hybrid horned lizard optimization algorithm-aquila optimizer for DC motor
PDF
Transform Your ITIL® 4 & ITSM Strategy with AI in 2025.pdf
PPTX
observCloud-Native Containerability and monitoring.pptx
PDF
Hindi spoken digit analysis for native and non-native speakers
PDF
Taming the Chaos: How to Turn Unstructured Data into Decisions
PDF
A review of recent deep learning applications in wood surface defect identifi...
PDF
A contest of sentiment analysis: k-nearest neighbor versus neural network
Enhancing emotion recognition model for a student engagement use case through...
Web Crawler for Trend Tracking Gen Z Insights.pptx
sustainability-14-14877-v2.pddhzftheheeeee
The various Industrial Revolutions .pptx
Chapter 5: Probability Theory and Statistics
MicrosoftCybserSecurityReferenceArchitecture-April-2025.pptx
Architecture types and enterprise applications.pdf
Unlock new opportunities with location data.pdf
Final SEM Unit 1 for mit wpu at pune .pptx
A comparative study of natural language inference in Swahili using monolingua...
Getting started with AI Agents and Multi-Agent Systems
Univ-Connecticut-ChatGPT-Presentaion.pdf
Zenith AI: Advanced Artificial Intelligence
Hybrid horned lizard optimization algorithm-aquila optimizer for DC motor
Transform Your ITIL® 4 & ITSM Strategy with AI in 2025.pdf
observCloud-Native Containerability and monitoring.pptx
Hindi spoken digit analysis for native and non-native speakers
Taming the Chaos: How to Turn Unstructured Data into Decisions
A review of recent deep learning applications in wood surface defect identifi...
A contest of sentiment analysis: k-nearest neighbor versus neural network

Android UI Development: Tips, Tricks, and Techniques

  • 1. Android UI Development: Tips, Tricks, and Techniques Romain Guy Chet Haase Android UI Toolkit Team Google
  • 2. Android UI Development: rrific Tips,Tricks, and Techniques lly Te Tota Romain Guy Chet Haase Android UI Toolkit Team Google
  • 4. Trash Talk or Garbage Zero Avoid creating garbage, when necessary and possible
  • 5. Statics as Temporaries • Instead of a temporary object: public boolean pointInArea(int x, int y, Area area) { Point testPoint = new Point(x, y); return area.intersect(testPoint); } • Consider a static instead: static final Point tmpPoint = new Point(); public boolean pointInArea(int x, int y, Area area) { tmpPoint.x = x; tmpPoint.y = y; return area.intersect(tmpPoint.yPoint); } 5
  • 6. AutoBoxing • Autoboxing creates Objects float x = 5; Float y = x; doSomething(x); void doSomething(Float z) {} is equivalent to float x = 5; Float y = new Float(x); doSomething(new Float(x)); void doSomething(Float z) {} 6
  • 7. De-Autoboxing • Use primitive types whenever possible –Avoids Object creation • Use types you need for the situation –Avoids autoboxing back and forth 7
  • 8. Obliterator • The enhanced for() loop is great • ... but creates garbage for (Node node : nodeList) {} is equivalent to Iterator iter = nodeList.iterator(); while (iter.hasNext()) {} • Consider a size check first: if (nodeList.size() > 0) { for (Node node : nodeList) {} } 8
  • 9. Image is Everything • Recycle those Bitmaps –Device resources are limited • Finalizers will clear them ... eventually • You might think this would help // done using this one, clear reference myBitmap = null; • But you really want to do this // done using this one, recycle it myBitmap.recycle(); • Don’t wait for the finalizer to do the work if you need that memory now 9
  • 10. Varargh • Parameters to varargs method packaged into a temporary array void someMethod(float... args) {} someMethod(5f); is equivalent to someMethod(new float[]{5}); 10
  • 11. Gener-ick • T doesn’t stand for “primitive Type” public class MyClass<T> { T myVar; MyClass<T>(T arg) { myVar = arg; } } • Generics only deal with Objects; primitive types get autoboxed float f; MyClass<Float> myObject = new MyClass<Float>(f); which is equivalent to MyClass<Float> myObject = new MyClass<Float>(new Float(f)); 11
  • 12. Tools: Allocation Tracking • Limit allocations to find problems int prevLimt = -1; try { prevLimit = Debug.setAllocationLimit(0); // Do stuff } finally { Debug.setAllocationLimit(-1); } • Count the allocations being made Debug.startAllocationCounting(); // do stuff int allocCount = Debug.getThreadAllocCount(); Debug.stopAllocationCounting); 12
  • 13. Tools: DDMS • Visual tool helps track allocations down to the object/file/line number • (demo) 13
  • 14. Watch the Garbage... But Don’t Be Silly • As Michael Abrash might have said: ViewRoot –“Premature optimization is the Root of all evil” • Minor garbage is irrelevant in most cases • But if you have GCs at critical points in your application, consider Garbage Zero –Example: animations 14
  • 15. Tools: hat • DDMS • Heap Analysis Tool is used to track down memory leaks • adb shell dumpsys meminfo <process> 15
  • 16. Memory leaks • Be careful with Context • Be careful with static fields • Avoid non-static inner classes • Use weak references 16
  • 18. Responsiveness • Single-threaded UI • Don’t block the UI thread – Also called main thread • AsyncTask – Worker thread and UI thread messaging • Handler – Messaging 18
  • 19. Overinvalidating • Only redraw what you must • (demo) 19
  • 20. Fewer is better • Many views – Slower layout – Slower drawing – Slower startup time • Deep hierarchies – Memory – Slow... – StackOverflowException 20
  • 22. Layout optimizations • Custom views • Custom layouts • <merge /> • ViewStub • Compound drawables • layoutopt 22
  • 23. ViewStub 23
  • 24. ViewStub 24
  • 25. ViewStub <ViewStub android:id="@+id/stub_import" android:inflatedId="@+id/panel_import" android:layout="@layout/progress_overlay" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" /> 25
  • 26. ViewStub findViewById(R.id.stub_import).setVisibility(View.VISIBLE); // or View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate(); 26
  • 27. <merge/> 27
  • 28. <merge/> <!-- The merge tag must be the root tag --> <merge xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Content --> </merge> 28
  • 29. Compound drawables <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout> 29
  • 30. Compound drawables <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello" android:drawableLeft="@drawable/icon" /> 30
  • 32. ListView 1 public View getView(int position, View convertView, ViewGroup parent) { 2 View item = mInflater.inflate(R.layout.list_item_icon_text, null); 3 ((TextView) item.findViewById(R.id.text)).setText(DATA[position]); 4 ((ImageView) item.findViewById(R.id.icon)).setImageBitmap( 5 (position & 1) == 1 ? mIcon1 : mIcon2); 6 return item; 7 } 32
  • 33. ListView 1 public View getView(int position, View convertView, ViewGroup parent) { 2 if (convertView == null) { 3 convertView = mInflater.inflate(R.layout.item, parent, false); 4 } 5 ((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]); 6 ((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap( 7 (position & 1) == 1 ? mIcon1 : mIcon2); 8 return convertView; 9 } 33
  • 34. ListView static class ViewHolder { TextView text; ImageView icon; } 34
  • 35. ListView 1 public View getView(int position, View convertView, ViewGroup parent) { 2 ViewHolder holder; 3 4 if (convertView == null) { 5 convertView = mInflater.inflate(R.layout.list_item_icon_text, 6 parent, false); 7 holder = new ViewHolder(); 8 holder.text = (TextView) convertView.findViewById(R.id.text); 9 holder.icon = (ImageView) convertView.findViewById(R.id.icon); 10 11 convertView.setTag(holder); 12 } else { 13 holder = (ViewHolder) convertView.getTag(); 14 } 15 16 holder.text.setText(DATA[position]); 17 holder.icon.setImageBitmap((position & 1) ==? mIcon1 : mIcon2); 18 19 return convertView; 20 } 35
  • 36. ListView 60.0 50.0 40.0 30.0 20.0 10.0 0 Dumb Correct Fast List of 10,000 items on NexusOne, Android 2.2 36
  • 37. Graphics optimizations • Pre-scale bitmaps • Use compatible bitmaps – ARGB_8888 to draw on 32 bits window • Avoid blending • Use View drawing caches – View.setDrawingCacheEnabled(true) • View.isOpaque() 37
  • 38. For More Information • Android developer site –developer.android.com • Romain –@romainguy –curious-creature.org • Chet –@chethaase –graphics-geek.blogspot.com 38