Successfully reported this slideshow.
Android Development...and the daily challengesDominik Helleberginovex GmbH      Wir nutzen Technologien, um unsere Kunden ...
IntroDominik Helleberg       • Mobile       • Android       • HTML5       • http://twitter.com/_cirrus_       • http://dom...
Agenda• Intro• Leben in der richtigen Reihenfolge: Lifecycle• Dispatch it: Asynchrone Aufgaben• ListViews• Build it up-to-...
Activity Lifecycle10.02.2012           4
Activity Lifecycle Testen     Device / Emulator rotieren     Prozess Limit auf 1 setzen     JUnit test schreibenpublic voi...
Dispatch it: Asynchrone AufgabenAufgabe:Die App soll die letzte News von Spiegel Onlineanzeigen.10.02.2012                ...
Dispatch it: Asynchrone Aufgabenprivate void fetchSpiegelHeadline(){            final String headline = "Eurokrise!";     ...
Dispatch it: Asynchrone Aufgaben@Overrideprotected void onStart() {           super.onStart();           fetchSpiegelHeadl...
Dispatch it: Asynchrone Aufgaben@Overrideprotected void onStart() {           super.onStart();           fetchSpiegelHeadl...
Dispatch it: Asynchrone Aufgaben     Problem:             Lang andauernde Operationen:                Netzwerk            ...
Dispatch it: Asynchrone AufgabenVariante 1: Threadsprivate void useThread() {             Thread thread = new Thread(new R...
Dispatch it: Asynchrone AufgabenVariante 1: Threadsprivate void fetchSpiegelHeadline(){            final String headline =...
Dispatch it: Asynchrone AufgabenVariante 1: ThreadsWas passiert dann?a) Die Activity wird angezeigt, nach ca. 15 Sekunden ...
Dispatch it: Asynchrone AufgabenVariante 1: ThreadsWas passiert dann?a) Die Activity wird angezeigt, nach ca. 15 Sekunden ...
Dispatch it: Asynchrone AufgabenVariante 1: Threads FIXEDprivate void fetchSpiegelHeadline(){            final String head...
Dispatch it: Asynchrone AufgabenVariante 2: AsyncTaskclass HeadLineAsyncTask extends AsyncTask<Void, Void, String>{       ...
Dispatch it: Asynchrone AufgabenVariante 2: AsyncTaskprivate void useAsyncTask() {           HeadLineAsyncTask asyncTask =...
Dispatch it: Asynchrone AufgabenVariante 3: Intent Serviceprivate void useIntentService(){           startService(new Inte...
Dispatch it: Asynchrone AufgabenVariante 3: Intent Service@Overrideprotected void onStop() {          super.onStop();     ...
Dispatch it: Asynchrone AufgabenVariante 3: Intent Serviceclass HeadlineReceiver extends BroadcastReceiver{           @Ove...
Dispatch it: Asynchrone AufgabenVariante 4: Loaderprivate void useLoader() {            getLoaderManager().initLoader(0, n...
Dispatch it: Asynchrone Aufgaben - Übersicht Variante    Pros              Cons                 Kommentare            API ...
ListViews     Universell einsetzbar     Lösen viele „klassische“ UI-     Elemente ab (Menus, Tree Views)     Einfach zu be...
ListViews – The Framework     View Recycling             Android recycelt Views             Daten müssen von Views getrenn...
ListViews – View Recycling     View Recycling             Android recycelt Views             Daten müssen von Views getren...
ListViews – View HolderView Holder – Klasse um recycelte Views schnell füllen zu können@Overridepublic View getView(int po...
Build it up-to-date     Fragments     ActionBar     User Interface / Interaction Design10.02.2012                         ...
Build it up-to-date – Fragments     Komponenten mit eigenem Lifecycle     Benötigen eine Activity     Eine Activity kann 1...
Build it up-to-date – Fragments  Kommunikation mit der Activity und anderen Fragments über        Interfaces             A...
Build it up-to-date – ActionBar     Ersetzt den „TitleBar“     Ersetzt das klassische „Options Menu“     Versucht das „Aus...
Build it up-to-date – ActionBar   • App Icon oder Logo   • „In-App“ Navigation (optional)10.02.2012                       ...
Build it up-to-date – ActionBar   • „View Details“             – Titel             – In-View Navigation             – Filt...
Build it up-to-date – ActionBar   Actions             –   Häufigste Aktionen als Icon             –   Unwichtige Aktionen ...
Build it up-to-date – ActionBarKonvertierungen     – Options Menu -> Actions     – Tabbed Activity -> NavigationBar     – ...
Build it up-to-date – ActionBarActionBarSherlock• Erweiterung der Google compatibility library• Ermöglicht die Darstellung...
User Interface / Interaction Design10.02.2012                            36
User Interface / Interaction DesignDie wichtigsten News:     Menu Key ist deprecated     Kontextmenu ist deprecated     Lo...
Understanding compat modeTarget          Max   Sdk          Sdk           10           11-13   14   10.02.2012            ...
Understanding compat modeTarget                         Max   Sdk                         Sdk         10           11-13  ...
Understanding compat mode                             Target        Max                                Sdk        Sdk     ...
Useful Tools     Strict Mode - Since API Level 9 – Hift unfreiwilligepublic void onCreate() {               if (DEVELOPER_...
Useful Tools     Hierarchyviewer – Stand Alone Tool im SDK     Hilft Layout Fehler und performance Probleme zu finden10.02...
DANKE!DANKE!10.02.2012   43
Upcoming SlideShare
Loading in …5
×

Android Development ...and the daily challenges

1,250 views

Published on

Android Development ...and the daily challenges
My talk at the Java User Group Braunschweig, 9th of Feb. 2012

Published in: Technology, Business
  • Be the first to comment

Android Development ...and the daily challenges

  1. 1. Android Development...and the daily challengesDominik Helleberginovex GmbH Wir nutzen Technologien, um unsere Kunden glücklich zu machen. Und uns selbst.
  2. 2. IntroDominik Helleberg • Mobile • Android • HTML5 • http://twitter.com/_cirrus_ • http://dominik-helleberg.de/+10.02.2012 2
  3. 3. Agenda• Intro• Leben in der richtigen Reihenfolge: Lifecycle• Dispatch it: Asynchrone Aufgaben• ListViews• Build it up-to-date: Fragments / ActionBar / User Interface• Understanding compat mode• Useful Tools10.02.2012 3
  4. 4. Activity Lifecycle10.02.2012 4
  5. 5. Activity Lifecycle Testen Device / Emulator rotieren Prozess Limit auf 1 setzen JUnit test schreibenpublic void testLifeCycle(){ mActivity = getActivity(); Instrumentation mInstrumentation = getInstrumentation(); mInstrumentation.callActivityOnPause(mActivity); mInstrumentation.callActivityOnStop(mActivity); mInstrumentation.callActivityOnDestroy(mActivity); Log.v(TAG, "test done!");}10.02.2012 5
  6. 6. Dispatch it: Asynchrone AufgabenAufgabe:Die App soll die letzte News von Spiegel Onlineanzeigen.10.02.2012 6
  7. 7. Dispatch it: Asynchrone Aufgabenprivate void fetchSpiegelHeadline(){ final String headline = "Eurokrise!"; URL url = new URL("http://www.spiegel.de"); URLConnection connection = url.openConnection(); connection.connect(); //extract Headline Thread.sleep(15000); TextView tv = (TextView) findViewById(R.id.async_spiegel_headline); tv.setText(headline);}10.02.2012 7
  8. 8. Dispatch it: Asynchrone Aufgaben@Overrideprotected void onStart() { super.onStart(); fetchSpiegelHeadline();}Was passiert dann?a) Die Activity wird angezeigt, nach ca. 15 Sekunden wird die Headlinedargestelltb) Die Activity wird angzeigt, es folgt ein ANRc) Abhängig vom API Level des Zielgeräts fliegt eine Exception oder esfolgt ein ANRd) Die Activity wird nicht vollständig angezeigt, es folgt ein ANR10.02.2012 8
  9. 9. Dispatch it: Asynchrone Aufgaben@Overrideprotected void onStart() { super.onStart(); fetchSpiegelHeadline();}Was passiert dann?a) Die Activity wird angezeigt, nach ca. 15 Sekunden wird die Headlinedargestelltb) Die Activity wird angzeigt, es folgt ein ANRc) Abhängig vom API Level des Zielgeräts fliegt eine Exception oderes folgt ein ANRd) Die Activity wird nicht vollständig angezeigt, es folgt ein ANR10.02.2012 9
  10. 10. Dispatch it: Asynchrone Aufgaben Problem: Lang andauernde Operationen: Netzwerk File I/O Preferences Datenbankzugriffe Android definiert 2 Regeln: Do not block the UI thread Do not access the Android UI toolkit from outside the UI threadhttp://developer.android.com/guide/topics/fundamentals/processes-and-threads.html10.02.2012 10
  11. 11. Dispatch it: Asynchrone AufgabenVariante 1: Threadsprivate void useThread() { Thread thread = new Thread(new Runnable() { @Override public void run() { fetchSpiegelHeadline(); } }); thread.start();}10.02.2012 11
  12. 12. Dispatch it: Asynchrone AufgabenVariante 1: Threadsprivate void fetchSpiegelHeadline(){ final String headline = "Eurokrise!"; URL url = new URL("http://www.spiegel.de"); URLConnection connection = url.openConnection(); connection.connect(); //extract Headline Thread.sleep(15000); TextView tv = (TextView) findViewById(R.id.async_spiegel_headline); tv.setText(headline);}10.02.2012 12
  13. 13. Dispatch it: Asynchrone AufgabenVariante 1: ThreadsWas passiert dann?a) Die Activity wird angezeigt, nach ca. 15 Sekunden wird dieHeadline dargestelltb) Die Activity wird nicht angezeigt, es folgt ein ANRc) Die Activity wird angzeigt, es folgt ein ANRd) Die Activity wird angezeigt, nach ca. 15 Sekunden fliegt eineException10.02.2012 13
  14. 14. Dispatch it: Asynchrone AufgabenVariante 1: ThreadsWas passiert dann?a) Die Activity wird angezeigt, nach ca. 15 Sekunden wird dieHeadline dargestelltb) Die Activity wird nicht angezeigt, es folgt ein ANRc) Die Activity wird angzeigt, es folgt ein ANRd) Die Activity wird angezeigt, nach ca. 15 Sekunden fliegteine Exception10.02.2012 14
  15. 15. Dispatch it: Asynchrone AufgabenVariante 1: Threads FIXEDprivate void fetchSpiegelHeadline(){ final String headline = "Eurokrise!"; URL url = new URL("http://www.spiegel.de"); URLConnection connection = url.openConnection(); connection.connect(); //extract Headline Thread.sleep(15000); runOnUiThread(new Runnable() { @Override public void run() { TextView tv = (TextView) findViewById(R.id.async_spiegel_headline); tv.setText(headline); } });}10.02.2012 15
  16. 16. Dispatch it: Asynchrone AufgabenVariante 2: AsyncTaskclass HeadLineAsyncTask extends AsyncTask<Void, Void, String>{ @Override protected String doInBackground(Void... params) { final String headline = “Eurokrise!"; URL url = new URL("http://www.spiegel.de");URLConnection connection = url.openConnection(); connection.connect(); /extract Headline Thread.sleep(15000); return headline; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); TextView tv = (TextView) findViewById(R.id.async_spiegel_headline); tv.setText(result); }}10.02.2012 16
  17. 17. Dispatch it: Asynchrone AufgabenVariante 2: AsyncTaskprivate void useAsyncTask() { HeadLineAsyncTask asyncTask = new HeadLineAsyncTask(); asyncTask.execute();}10.02.2012 17
  18. 18. Dispatch it: Asynchrone AufgabenVariante 3: Intent Serviceprivate void useIntentService(){ startService(new Intent(this, SampleIntentService.class));}10.02.2012 18
  19. 19. Dispatch it: Asynchrone AufgabenVariante 3: Intent Service@Overrideprotected void onStop() { super.onStop(); LocalBroadcastManager.getInstance(this) .unregisterReceiver(mReciever);}@Overrideprotected void onStart() { super.onStart(); LocalBroadcastManager.getInstance(this) .registerReceiver(mReciever, new IntentFilter(SampleIntentService.INTENT_FILTER_HEADLINE));}10.02.2012 19
  20. 20. Dispatch it: Asynchrone AufgabenVariante 3: Intent Serviceclass HeadlineReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { //extract Headline final String headline = intent.getExtras().getString(SampleIntentService.EXTRA_HEADLINE); runOnUiThread(new Runnable() { @Override public void run() { TextView tv = (TextView) findViewById(R.id.async_spiegel_headline); tv.setText(headline); } }); }}10.02.2012 20
  21. 21. Dispatch it: Asynchrone AufgabenVariante 4: Loaderprivate void useLoader() { getLoaderManager().initLoader(0, null, this);}@Overridepublic Loader<String> onCreateLoader(int id, Bundle args) { return new HeadLinerLoader(this);}@Overridepublic void onLoadFinished(Loader<String> loader, String result) { TextView tv = (TextView) findViewById(R.id.async_spiegel_headline); tv.setText(result);}10.02.2012 21
  22. 22. Dispatch it: Asynchrone Aufgaben - Übersicht Variante Pros Cons Kommentare API Level Plain Volle Kontrolle Kontextgebunden AsyncTask ist 1 Threads Manuelle UI-Updates meistens besser Hohes Fehlerpotential AsyncTask UI-Updates Kontextgebunden ggf. 3rd party Libs 3 Einfache verwenden Implementierung Einfache Callbacks Services Eigener Kontext Synchronisierung / Intent Service 3 Queue-Kontrolle meist einfacher Komplizierte Callbacks Loader Eigener Kontext Vorgegebener 11 / 4 Lifecycle Wenig10.02.2012 Dokumentation 22
  23. 23. ListViews Universell einsetzbar Lösen viele „klassische“ UI- Elemente ab (Menus, Tree Views) Einfach zu bedienen Einfach zu implementieren?10.02.2012 23
  24. 24. ListViews – The Framework View Recycling Android recycelt Views Daten müssen von Views getrennt werden Performance Views so „günstig“ wie möglich erzeugen / füllen ViewHolder Pattern10.02.2012 24
  25. 25. ListViews – View Recycling View Recycling Android recycelt Views Daten müssen von Views getrennt werden!!10.02.2012 25
  26. 26. ListViews – View HolderView Holder – Klasse um recycelte Views schnell füllen zu können@Overridepublic View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if(v == null) { v = mLayoutInflater.inflate(R.layout.sequence_list_item, null); ViewHolder vh = new ViewHolder(); vh.pb = (SeekBar) v.findViewById(R.id.SequenceSeekBar01); vh.tb = (ToggleButton) v.findViewById(R.id.SequenceToggleButton01); v.setTag(vh); } ViewHolder vh = (ViewHolder) v.getTag(); vh.tb.setChecked( // set Data vh.pb.setProgress(//set Data return v;}class ViewHolder { SeekBar pb; ToggleButton tb; }10.02.2012 26
  27. 27. Build it up-to-date Fragments ActionBar User Interface / Interaction Design10.02.2012 27
  28. 28. Build it up-to-date – Fragments Komponenten mit eigenem Lifecycle Benötigen eine Activity Eine Activity kann 1 – x Fragments enthalten10.02.2012 28
  29. 29. Build it up-to-date – Fragments Kommunikation mit der Activity und anderen Fragments über Interfaces Activity implementiert MySpecialInterface Referenzen Fragments halten Referenzen auf andere Fragmente Intents Activity überschreibt public void startActivity(Intent i) und delegiert die Intents ggf. weiteriund tent)10.02.2012 29
  30. 30. Build it up-to-date – ActionBar Ersetzt den „TitleBar“ Ersetzt das klassische „Options Menu“ Versucht das „Aus den Augen aus dem Sinn“ Problem zu lösen Priorisiert die möglichen / sinnvollen Aktionen Ergänzt die klassische „Back“ – Navigation Wird auch auf Android 2.x schon von vielen populären Apps eingesetzt10.02.2012 30
  31. 31. Build it up-to-date – ActionBar • App Icon oder Logo • „In-App“ Navigation (optional)10.02.2012 31
  32. 32. Build it up-to-date – ActionBar • „View Details“ – Titel – In-View Navigation – Filter / Drop Downs10.02.2012 32
  33. 33. Build it up-to-date – ActionBar Actions – Häufigste Aktionen als Icon – Unwichtige Aktionen im Overflow Menu – Texteingabe – Statusanzeige10.02.2012 33
  34. 34. Build it up-to-date – ActionBarKonvertierungen – Options Menu -> Actions – Tabbed Activity -> NavigationBar – TitleBar -> ActionBar – MenuKey -> 10.02.2012 34
  35. 35. Build it up-to-date – ActionBarActionBarSherlock• Erweiterung der Google compatibility library• Ermöglicht die Darstellung von ActionBars ab Android 1.6• Nicht voll 3.x / 4.x API kompatibel• http://actionbarsherlock.com 10.02.2012 35
  36. 36. User Interface / Interaction Design10.02.2012 36
  37. 37. User Interface / Interaction DesignDie wichtigsten News: Menu Key ist deprecated Kontextmenu ist deprecated Long Press ist jetzt „selektieren“ Neue Gesten (horizontal swipe)10.02.2012 37
  38. 38. Understanding compat modeTarget Max Sdk Sdk 10 11-13 14 10.02.2012 38
  39. 39. Understanding compat modeTarget Max Sdk Sdk 10 11-13 14 10.02.2012 39
  40. 40. Understanding compat mode Target Max Sdk Sdk 10 11-13 1410.02.2012 40
  41. 41. Useful Tools Strict Mode - Since API Level 9 – Hift unfreiwilligepublic void onCreate() { if (DEVELOPER_MODE) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() .penaltyLog() .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() .penaltyLog() .penaltyDeath() .build()); } super.onCreate();}10.02.2012 41
  42. 42. Useful Tools Hierarchyviewer – Stand Alone Tool im SDK Hilft Layout Fehler und performance Probleme zu finden10.02.2012 42
  43. 43. DANKE!DANKE!10.02.2012 43

×