Successfully reported this slideshow.

Android Development ...and the daily challenges

1

Share

Loading in …3
×
1 of 43
1 of 43

Android Development ...and the daily challenges

1

Share

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

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

More Related Content

Related Books

Free with a 14 day trial from Scribd

See all

Related Audiobooks

Free with a 14 day trial from Scribd

See all

Android Development ...and the daily challenges

  1. 1. Android Development ...and the daily challenges Dominik Helleberg inovex GmbH Wir nutzen Technologien, um unsere Kunden glücklich zu machen. Und uns selbst.
  2. 2. Intro Dominik 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 Tools 10.02.2012 3
  4. 4. Activity Lifecycle 10.02.2012 4
  5. 5. Activity Lifecycle Testen Device / Emulator rotieren Prozess Limit auf 1 setzen JUnit test schreiben public 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 Aufgaben Aufgabe: Die App soll die letzte News von Spiegel Online anzeigen. 10.02.2012 6
  7. 7. Dispatch it: Asynchrone Aufgaben private 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 @Override protected void onStart() { super.onStart(); fetchSpiegelHeadline(); } Was passiert dann? a) Die Activity wird angezeigt, nach ca. 15 Sekunden wird die Headline dargestellt b) Die Activity wird angzeigt, es folgt ein ANR c) Abhängig vom API Level des Zielgeräts fliegt eine Exception oder es folgt ein ANR d) Die Activity wird nicht vollständig angezeigt, es folgt ein ANR 10.02.2012 8
  9. 9. Dispatch it: Asynchrone Aufgaben @Override protected void onStart() { super.onStart(); fetchSpiegelHeadline(); } Was passiert dann? a) Die Activity wird angezeigt, nach ca. 15 Sekunden wird die Headline dargestellt b) Die Activity wird angzeigt, es folgt ein ANR c) Abhängig vom API Level des Zielgeräts fliegt eine Exception oder es folgt ein ANR d) Die Activity wird nicht vollständig angezeigt, es folgt ein ANR 10.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 thread http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html 10.02.2012 10
  11. 11. Dispatch it: Asynchrone Aufgaben Variante 1: Threads private void useThread() { Thread thread = new Thread(new Runnable() { @Override public void run() { fetchSpiegelHeadline(); } }); thread.start(); } 10.02.2012 11
  12. 12. Dispatch it: Asynchrone Aufgaben Variante 1: Threads private 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 Aufgaben Variante 1: Threads Was passiert dann? a) Die Activity wird angezeigt, nach ca. 15 Sekunden wird die Headline dargestellt b) Die Activity wird nicht angezeigt, es folgt ein ANR c) Die Activity wird angzeigt, es folgt ein ANR d) Die Activity wird angezeigt, nach ca. 15 Sekunden fliegt eine Exception 10.02.2012 13
  14. 14. Dispatch it: Asynchrone Aufgaben Variante 1: Threads Was passiert dann? a) Die Activity wird angezeigt, nach ca. 15 Sekunden wird die Headline dargestellt b) Die Activity wird nicht angezeigt, es folgt ein ANR c) Die Activity wird angzeigt, es folgt ein ANR d) Die Activity wird angezeigt, nach ca. 15 Sekunden fliegt eine Exception 10.02.2012 14
  15. 15. Dispatch it: Asynchrone Aufgaben Variante 1: Threads FIXED private 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 Aufgaben Variante 2: AsyncTask class 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 Aufgaben Variante 2: AsyncTask private void useAsyncTask() { HeadLineAsyncTask asyncTask = new HeadLineAsyncTask(); asyncTask.execute(); } 10.02.2012 17
  18. 18. Dispatch it: Asynchrone Aufgaben Variante 3: Intent Service private void useIntentService() { startService(new Intent(this, SampleIntentService.class)); } 10.02.2012 18
  19. 19. Dispatch it: Asynchrone Aufgaben Variante 3: Intent Service @Override protected void onStop() { super.onStop(); LocalBroadcastManager.getInstance(this) .unregisterReceiver(mReciever); } @Override protected void onStart() { super.onStart(); LocalBroadcastManager.getInstance(this) .registerReceiver(mReciever, new IntentFilter(SampleIntentService.INTENT_FILTER_HEADLINE)); } 10.02.2012 19
  20. 20. Dispatch it: Asynchrone Aufgaben Variante 3: Intent Service class 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 Aufgaben Variante 4: Loader private void useLoader() { getLoaderManager().initLoader(0, null, this); } @Override public Loader<String> onCreateLoader(int id, Bundle args) { return new HeadLinerLoader(this); } @Override public 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 Wenig 10.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 Pattern 10.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 Holder View Holder – Klasse um recycelte Views schnell füllen zu können @Override public 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 Design 10.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 enthalten 10.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 eingesetzt 10.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 Downs 10.02.2012 32
  33. 33. Build it up-to-date – ActionBar Actions – Häufigste Aktionen als Icon – Unwichtige Aktionen im Overflow Menu – Texteingabe – Statusanzeige 10.02.2012 33
  34. 34. Build it up-to-date – ActionBar Konvertierungen – Options Menu -> Actions – Tabbed Activity -> NavigationBar – TitleBar -> ActionBar – MenuKey -> 10.02.2012 34
  35. 35. Build it up-to-date – ActionBar ActionBarSherlock • 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 Design 10.02.2012 36
  37. 37. User Interface / Interaction Design Die 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 mode Target Max Sdk Sdk 10 11-13 14 10.02.2012 38
  39. 39. Understanding compat mode Target Max Sdk Sdk 10 11-13 14 10.02.2012 39
  40. 40. Understanding compat mode Target Max Sdk Sdk 10 11-13 14 10.02.2012 40
  41. 41. Useful Tools Strict Mode - Since API Level 9 – Hift unfreiwillige public 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 finden 10.02.2012 42
  43. 43. DANKE! DANKE! 10.02.2012 43

×