Muni android-18-5-2012

357 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
357
On SlideShare
0
From Embeds
0
Number of Embeds
61
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Muni android-18-5-2012

  1. 1. Android 2 Ondra Zahradník MUNI - 18.5.2012Tuesday, March 19, 13
  2. 2. AgendaTuesday, March 19, 13nejdrive trochu teorie, potom prakticky prikladprvni dva priklady se tykaji UI, druhe dva pak programovanibehem prikladu budu obchazet a pomahat
  3. 3. Agenda 1.Rekapitulace z minulaTuesday, March 19, 13nejdrive trochu teorie, potom prakticky prikladprvni dva priklady se tykaji UI, druhe dva pak programovanibehem prikladu budu obchazet a pomahat
  4. 4. Agenda 1.Rekapitulace z minula 2.BroadcastReceiverTuesday, March 19, 13nejdrive trochu teorie, potom prakticky prikladprvni dva priklady se tykaji UI, druhe dva pak programovanibehem prikladu budu obchazet a pomahat
  5. 5. Agenda 1.Rekapitulace z minula 2.BroadcastReceiver 3.Podpora různých zařízeníTuesday, March 19, 13nejdrive trochu teorie, potom prakticky prikladprvni dva priklady se tykaji UI, druhe dva pak programovanibehem prikladu budu obchazet a pomahat
  6. 6. Agenda 1.Rekapitulace z minula 2.BroadcastReceiver 3.Podpora různých zařízení 4.Dynamické UI pomocí fragmentůTuesday, March 19, 13nejdrive trochu teorie, potom prakticky prikladprvni dva priklady se tykaji UI, druhe dva pak programovanibehem prikladu budu obchazet a pomahat
  7. 7. Agenda 1.Rekapitulace z minula 2.BroadcastReceiver 3.Podpora různých zařízení 4.Dynamické UI pomocí fragmentů 5.PřestávkaTuesday, March 19, 13nejdrive trochu teorie, potom prakticky prikladprvni dva priklady se tykaji UI, druhe dva pak programovanibehem prikladu budu obchazet a pomahat
  8. 8. Agenda 1.Rekapitulace z minula 2.BroadcastReceiver 3.Podpora různých zařízení 4.Dynamické UI pomocí fragmentů 5.Přestávka 6.Architektura typické aplikaceTuesday, March 19, 13nejdrive trochu teorie, potom prakticky prikladprvni dva priklady se tykaji UI, druhe dva pak programovanibehem prikladu budu obchazet a pomahat
  9. 9. Agenda 1.Rekapitulace z minula 2.BroadcastReceiver 3.Podpora různých zařízení 4.Dynamické UI pomocí fragmentů 5.Přestávka 6.Architektura typické aplikace 7.Otázky a odpovědiTuesday, March 19, 13nejdrive trochu teorie, potom prakticky prikladprvni dva priklady se tykaji UI, druhe dva pak programovanibehem prikladu budu obchazet a pomahat
  10. 10. House-keeping notes •slajdy - http://goo.gl/QiFDy •zdroje - http://goo.gl/QH5J7 •vaše otázkyTuesday, March 19, 13
  11. 11. Rekapitulace z minula 1.Android SDK 2.Eclipse + ADT 3.Emulátor / device 4.Založení nového projektu 5.Struktura Android projektu 6.Activity, layout, Intent = UI 7.Kompilace a spuštění 8.DebuggingTuesday, March 19, 13
  12. 12. BroadcastyTuesday, March 19, 13aplikaci to i probudívykonat rychlou akci (limit 10s)mozno broadcasty radit i stopnout
  13. 13. Broadcasty •Aplikace reaguje na důležité událostiTuesday, March 19, 13aplikaci to i probudívykonat rychlou akci (limit 10s)mozno broadcasty radit i stopnout
  14. 14. Broadcasty •Aplikace reaguje na důležité události • Boot, SMS, Call, připojení, čas...Tuesday, March 19, 13aplikaci to i probudívykonat rychlou akci (limit 10s)mozno broadcasty radit i stopnout
  15. 15. Broadcasty •Aplikace reaguje na důležité události • Boot, SMS, Call, připojení, čas... •BroadcastReceiverTuesday, March 19, 13aplikaci to i probudívykonat rychlou akci (limit 10s)mozno broadcasty radit i stopnout
  16. 16. Broadcasty •Aplikace reaguje na důležité události • Boot, SMS, Call, připojení, čas... •BroadcastReceiver <receiver android:name=".SMSReceiver"> <intent-filter > <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver>Tuesday, March 19, 13aplikaci to i probudívykonat rychlou akci (limit 10s)mozno broadcasty radit i stopnout
  17. 17. Broadcasty •Aplikace reaguje na důležité události • Boot, SMS, Call, připojení, čas... •BroadcastReceiver <receiver android:name=".SMSReceiver"> <intent-filter > <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> public class SMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context ctx, Intent i) { //TODO do something } }Tuesday, March 19, 13aplikaci to i probudívykonat rychlou akci (limit 10s)mozno broadcasty radit i stopnout
  18. 18. Broadcasty •Aplikace reaguje na důležité události • Boot, SMS, Call, připojení, čas... •BroadcastReceiver <receiver android:name=".SMSReceiver"> <intent-filter > <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> public class SMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context ctx, Intent i) { •Možno definovat vlastní //TODO do something } }Tuesday, March 19, 13aplikaci to i probudívykonat rychlou akci (limit 10s)mozno broadcasty radit i stopnout
  19. 19. Broadcasty •Aplikace reaguje na důležité události • Boot, SMS, Call, připojení, čas... •BroadcastReceiver <receiver android:name=".SMSReceiver"> <intent-filter > <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> public class SMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context ctx, Intent i) { •Možno definovat vlastní //TODO do something } } • globálníTuesday, March 19, 13aplikaci to i probudívykonat rychlou akci (limit 10s)mozno broadcasty radit i stopnout
  20. 20. Broadcasty •Aplikace reaguje na důležité události • Boot, SMS, Call, připojení, čas... •BroadcastReceiver <receiver android:name=".SMSReceiver"> <intent-filter > <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> public class SMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context ctx, Intent i) { •Možno definovat vlastní //TODO do something } } • globální • lokální - notifikační systém uvnitř appky, levnéTuesday, March 19, 13aplikaci to i probudívykonat rychlou akci (limit 10s)mozno broadcasty radit i stopnout
  21. 21. PříkladTuesday, March 19, 13
  22. 22. Příklad •Vypište číslo a text příchozí sms v toastuTuesday, March 19, 13
  23. 23. Příklad •Vypište číslo a text příchozí sms v toastu • Toast - http://goo.gl/WoTkTuesday, March 19, 13
  24. 24. Příklad •Vypište číslo a text příchozí sms v toastu • Toast - http://goo.gl/WoTk • Oprávnění android.permission.RECEIVE_SMSTuesday, March 19, 13
  25. 25. Příklad •Vypište číslo a text příchozí sms v toastu • Toast - http://goo.gl/WoTk • Oprávnění android.permission.RECEIVE_SMS • SMS Intent - extra “pdus” seznam smsekTuesday, March 19, 13
  26. 26. Příklad •Vypište číslo a text příchozí sms v toastu • Toast - http://goo.gl/WoTk • Oprávnění android.permission.RECEIVE_SMS • SMS Intent - extra “pdus” seznam smsek • SmsMessage.createFromPduTuesday, March 19, 13
  27. 27. Příklad •Vypište číslo a text příchozí sms v toastu • Toast - http://goo.gl/WoTk • Oprávnění android.permission.RECEIVE_SMS • SMS Intent - extra “pdus” seznam smsek • SmsMessage.createFromPdu •SMS lze posílat z DDMS do emulátoruTuesday, March 19, 13
  28. 28. Příklad •Vypište číslo a text příchozí sms v toastu • Toast - http://goo.gl/WoTk • Oprávnění android.permission.RECEIVE_SMS • SMS Intent - extra “pdus” seznam smsek • SmsMessage.createFromPdu •SMS lze posílat z DDMS do emulátoru •zdrojáky - muni-android-helloTuesday, March 19, 13
  29. 29. Různá zařízeníTuesday, March 19, 13
  30. 30. Různá zařízení •deklarativně podadresáři v /resTuesday, March 19, 13
  31. 31. Různá zařízení •deklarativně podadresáři v /res •defaultní a alternativníTuesday, March 19, 13
  32. 32. Různá zařízení •deklarativně podadresáři v /res •defaultní a alternativní dvě zařízení jeden layoutTuesday, March 19, 13
  33. 33. Různá zařízení •deklarativně podadresáři v /res •defaultní a alternativní dvě zařízení jeden layout jedno zařízení dva layoutyTuesday, March 19, 13
  34. 34. Zdroje a kvalifikátoryTuesday, March 19, 13
  35. 35. Zdroje a kvalifikátory •ZdrojeTuesday, March 19, 13
  36. 36. Zdroje a kvalifikátory •Zdroje • texty, obrázky, layout, barvy,...Tuesday, March 19, 13
  37. 37. Zdroje a kvalifikátory •Zdroje MyProject/ src/ • texty, obrázky, layout, barvy,... MyActivity.java res/ drawable/ icon.png layout/ main.xml info.xml values/ strings.xmlTuesday, March 19, 13
  38. 38. Zdroje a kvalifikátory •Zdroje MyProject/ src/ • texty, obrázky, layout, barvy,... MyActivity.java res/ drawable/ icon.png •Kvalifikátory layout/ main.xml info.xml values/ strings.xml • jazyk (en_rUS, cs, ...)Tuesday, March 19, 13
  39. 39. Zdroje a kvalifikátory •Zdroje MyProject/ src/ • texty, obrázky, layout, barvy,... MyActivity.java res/ drawable/ icon.png •Kvalifikátory layout/ main.xml info.xml values/ strings.xml • jazyk (en_rUS, cs, ...) • nejmenší šířka (sw720dp)Tuesday, March 19, 13
  40. 40. Zdroje a kvalifikátory •Zdroje MyProject/ src/ • texty, obrázky, layout, barvy,... MyActivity.java res/ drawable/ icon.png •Kvalifikátory layout/ main.xml info.xml values/ strings.xml • jazyk (en_rUS, cs, ...) • nejmenší šířka (sw720dp) • velikost obrazovky (small, normal, large, xlarge)Tuesday, March 19, 13
  41. 41. Zdroje a kvalifikátory •Zdroje MyProject/ src/ • texty, obrázky, layout, barvy,... MyActivity.java res/ drawable/ icon.png •Kvalifikátory layout/ main.xml info.xml values/ strings.xml • jazyk (en_rUS, cs, ...) • nejmenší šířka (sw720dp) • velikost obrazovky (small, normal, large, xlarge) • orientace (land, port)Tuesday, March 19, 13
  42. 42. Zdroje a kvalifikátory •Zdroje MyProject/ src/ • texty, obrázky, layout, barvy,... MyActivity.java res/ drawable/ icon.png •Kvalifikátory layout/ main.xml info.xml values/ strings.xml • jazyk (en_rUS, cs, ...) • nejmenší šířka (sw720dp) • velikost obrazovky (small, normal, large, xlarge) • orientace (land, port) • hustota (ldpi, mdpi, hdpi, xhdpi)Tuesday, March 19, 13
  43. 43. Zdroje a kvalifikátory •Zdroje MyProject/ src/ • texty, obrázky, layout, barvy,... MyActivity.java res/ drawable/ icon.png •Kvalifikátory layout/ main.xml info.xml values/ strings.xml • jazyk (en_rUS, cs, ...) • nejmenší šířka (sw720dp) • velikost obrazovky (small, normal, large, xlarge) • orientace (land, port) • hustota (ldpi, mdpi, hdpi, xhdpi) res/ • layout, layout-land, layout-land-v13 drawable/ icon.png background.png • drawable, drawable-hdpi, drawable-xhdpi drawable-hdpi/ icon.png background.pngTuesday, March 19, 13
  44. 44. Resource resolvingTuesday, March 19, 13
  45. 45. Resource resolvingTuesday, March 19, 13
  46. 46. Resource resolving drawable/ drawable-en/ drawable-fr-rCA/ drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/Tuesday, March 19, 13
  47. 47. Resource resolving drawable/ drawable-en/ drawable-fr-rCA/ Locale = en-GB drawable-en-port/ Screen orientation = port drawable-en-notouch-12key/ Screen pixel density = hdpi drawable-port-ldpi/ Touchscreen type = notouch drawable-port-notouch-12key/ Primary text input method = 12keyTuesday, March 19, 13
  48. 48. Resource resolving drawable/ drawable-en/ drawable-fr-rCA/ Locale = en-GB drawable-en-port/ Screen orientation = port drawable-en-notouch-12key/ Screen pixel density = hdpi drawable-port-ldpi/ Touchscreen type = notouch drawable-port-notouch-12key/ Primary text input method = 12key drawable/ drawable-en/ drawable-fr-rCA/ drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/Tuesday, March 19, 13
  49. 49. Resource resolving drawable/ drawable-en/ drawable-fr-rCA/ Locale = en-GB drawable-en-port/ Screen orientation = port drawable-en-notouch-12key/ Screen pixel density = hdpi drawable-port-ldpi/ Touchscreen type = notouch drawable-port-notouch-12key/ Primary text input method = 12key drawable/ drawable-en/ drawable-fr-rCA/ drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/ drawable/ drawable-en/ drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/Tuesday, March 19, 13
  50. 50. Resource resolving drawable/ drawable-en/ drawable-fr-rCA/ Locale = en-GB drawable-en-port/ Screen orientation = port drawable-en-notouch-12key/ Screen pixel density = hdpi drawable-port-ldpi/ Touchscreen type = notouch drawable-port-notouch-12key/ Primary text input method = 12key drawable/ drawable-en/ drawable-fr-rCA/ drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/ drawable/ drawable-en/ drawable-en-port/ drawable-en-notouch-12key/ drawable-port-ldpi/ drawable-port-notouch-12key/ drawable-en/ drawable-en-port/ drawable-en-notouch-12key/Tuesday, March 19, 13
  51. 51. Různé obrazovkyTuesday, March 19, 13
  52. 52. Různé obrazovky •obrazovky small, normal, large, xlargeTuesday, March 19, 13
  53. 53. Různé obrazovky •obrazovky small, normal, large, xlarge • wrap_content, match_parent • RelativeLayoutTuesday, March 19, 13
  54. 54. Různé obrazovky •obrazovky small, normal, large, xlarge • wrap_content, match_parent • RelativeLayout • 9-patchTuesday, March 19, 13
  55. 55. Různé obrazovky •obrazovky small, normal, large, xlarge • wrap_content, match_parent • RelativeLayout • 9-patchTuesday, March 19, 13
  56. 56. Různé obrazovky •obrazovky small, normal, large, xlarge • wrap_content, match_parent • RelativeLayout • 9-patchTuesday, March 19, 13
  57. 57. Různé hustotyTuesday, March 19, 13
  58. 58. Různé hustoty •hustoty ldpi, mdpi, hdpi, xhdpiTuesday, March 19, 13
  59. 59. Různé hustoty •hustoty ldpi, mdpi, hdpi, xhdpiTuesday, March 19, 13
  60. 60. Různé hustoty •hustoty ldpi, mdpi, hdpi, xhdpi • xhdpi: 2.0 • hdpi: 1.5 • mdpi: 1.0 (baseline) • ldpi: 0.75Tuesday, March 19, 13
  61. 61. Různé hustoty •hustoty ldpi, mdpi, hdpi, xhdpi MyProject/ res/ drawable-xhdpi/ • xhdpi: 2.0 awesomeimage.png • hdpi: 1.5 drawable-hdpi/ • mdpi: 1.0 (baseline) awesomeimage.png drawable-mdpi/ • ldpi: 0.75 awesomeimage.png drawable-ldpi/ awesomeimage.pngTuesday, March 19, 13
  62. 62. Různé hustoty •hustoty ldpi, mdpi, hdpi, xhdpi MyProject/ res/ drawable-xhdpi/ • xhdpi: 2.0 awesomeimage.png • hdpi: 1.5 drawable-hdpi/ • mdpi: 1.0 (baseline) awesomeimage.png drawable-mdpi/ • ldpi: 0.75 awesomeimage.png drawable-ldpi/ awesomeimage.png •dp = density independent pixelTuesday, March 19, 13
  63. 63. Podpora různých verzíTuesday, March 19, 13
  64. 64. Podpora různých verzí •Na trhu Android v2.1 - v4.0.3Tuesday, March 19, 13
  65. 65. Podpora různých verzí •Na trhu Android v2.1 - v4.0.3 •Nastavit minSdkVersion a targetSdkVersion <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... >     <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />     ... </manifest>Tuesday, March 19, 13
  66. 66. Podpora různých verzí •Na trhu Android v2.1 - v4.0.3 •Nastavit minSdkVersion a targetSdkVersion •Kontrolovat verzi API private void setUpActionBar() {     // Make sure were running on Honeycomb or higher to use ActionBar APIs     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {         ActionBar actionBar = getActionBar();         actionBar.setDisplayHomeAsUpEnabled(true);     } }Tuesday, March 19, 13
  67. 67. Příklad •Rozšiřte příklad kalkulačky z minulé přednášky o podporu češtiny a landscape režimu •zdrojáky, ze kterých lze vyjít • muni-android-hello •dokumentace • http://goo.gl/RKihTTuesday, March 19, 13
  68. 68. Dynamické UI pomocí fragmentů •Fragment je kus funkčního UI •Aktivita hostí fragmenty •Jedna aplikace pro telefon i tabletTuesday, March 19, 13
  69. 69. FragmentTuesday, March 19, 13
  70. 70. FragmentTuesday, March 19, 13
  71. 71. Fragment Fragment a jeho UI public class ArticleFragment extends Fragment {     @Override     public View onCreateView(LayoutInflater inflater, ViewGroup container,         Bundle savedInstanceState) {         // Inflate the layout for this fragment         return inflater.inflate(R.layout.article_view, container, false);     } }Tuesday, March 19, 13
  72. 72. Fragment Fragment a jeho UI public class ArticleFragment extends Fragment {     @Override     public View onCreateView(LayoutInflater inflater, ViewGroup container,         Bundle savedInstanceState) {         // Inflate the layout for this fragment         return inflater.inflate(R.layout.article_view, container, false);     } } Layout <fragment android:name="com.example.android.fragments.ArticleFragment"               android:id="@+id/article_fragment"               android:layout_weight="2"               android:layout_width="0dp"               android:layout_height="match_parent" />Tuesday, March 19, 13
  73. 73. Fragment Fragment a jeho UI public class ArticleFragment extends Fragment {     @Override     public View onCreateView(LayoutInflater inflater, ViewGroup container,         Bundle savedInstanceState) {         // Inflate the layout for this fragment         return inflater.inflate(R.layout.article_view, container, false);     } } Layout <fragment android:name="com.example.android.fragments.ArticleFragment"               android:id="@+id/article_fragment"               android:layout_weight="2"               android:layout_width="0dp"               android:layout_height="match_parent" /> Instance public class MainActivity extends FragmentActivity {     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.news_articles);     } }Tuesday, March 19, 13
  74. 74. Fragmenty na telefonu a tabletuTuesday, March 19, 13
  75. 75. Fragmenty na telefonu a tabletuTuesday, March 19, 13
  76. 76. Fragmenty na telefonu a tabletu <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   android:orientation="horizontal"   android:layout_width="match_parent"   android:layout_height="match_parent"   android:id="@+id/frags">     <!-- "Fragment A" -->   <fragment class="com.example.android.TitlesFragment"             android:id="@+id/list_frag"             android:layout_width="@dimen/titles_size"             android:layout_height="match_parent"/>     <!-- "Fragment B" -->   <fragment class="com.example.android.DetailsFragment"             android:id="@+id/details_frag"             android:layout_width="match_parent"             android:layout_height="match_parent" /> </LinearLayout>Tuesday, March 19, 13
  77. 77. Fragmenty na telefonu a tabletu <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent"     android:layout_height="match_parent">     <!-- "Fragment A" -->     <fragment class="com.example.android.TitlesFragment"               android:id="@+id/list_frag"               android:layout_width="match_parent"               android:layout_height="match_parent"/> </FrameLayout>Tuesday, March 19, 13
  78. 78. Fragmenty na telefonu a tabletu public class MainActivity extends Activity implements TitlesFragment.OnItemSelectedListener {     public void onItemSelected(int position) {         DisplayFragment displayFrag = (DisplayFragment) getFragmentManager()                                     .findFragmentById(R.id.display_frag);         if (displayFrag == null) {             // DisplayFragment (Fragment B) is not in the layout (handset layout),             // so start DisplayActivity (Activity B)             // and pass it the info about the selected item             Intent intent = new Intent(this, DisplayActivity.class);             intent.putExtra("position", position);             startActivity(intent);         } else {             // DisplayFragment (Fragment B) is in the layout (tablet layout),             // so tell the fragment to update             displayFrag.updateContent(position);         }     } }Tuesday, March 19, 13
  79. 79. Komunikace mezi fragmentyTuesday, March 19, 13
  80. 80. Komunikace mezi fragmentyTuesday, March 19, 13
  81. 81. Komunikace mezi fragmenty •FragmentA definuje Listener interfaceTuesday, March 19, 13
  82. 82. Komunikace mezi fragmenty •FragmentA definuje Listener interface •Activity interface implementujeTuesday, March 19, 13
  83. 83. Komunikace mezi fragmenty •FragmentA definuje Listener interface •Activity interface implementuje •FragmentA volá callback onItemSelected(...)Tuesday, March 19, 13
  84. 84. Nové API na starých Androidech •support lib. zpřístupňuje nové api pro staré devices •Fragment, Loader •ViewPager, accessibility, NotificationBuilder,... import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; ... •ActionBarSherlock •AnimationsTuesday, March 19, 13
  85. 85. Příklad •do seznamu přidejte možnost změnit položku •změnu potvrďte FragmentDialogem •zdrojáky • http://goo.gl/NmK4o •dokumentace • http://goo.gl/tuZwX • http://goo.gl/bK5GQTuesday, March 19, 13
  86. 86. PřestávkaTuesday, March 19, 13
  87. 87. Architektura typické aplikace 1 •Zobraz seznam položek z databázeTuesday, March 19, 13
  88. 88. Architektura typické aplikace 1 •Zobraz seznam položek z databáze ListFragmentTuesday, March 19, 13
  89. 89. Architektura typické aplikace 1 •Zobraz seznam položek z databáze čte data ListFragment DBTuesday, March 19, 13
  90. 90. Architektura typické aplikace 1 •Zobraz seznam položek z databáze čte data ListFragment DB sqlTuesday, March 19, 13
  91. 91. Architektura typické aplikace 1 •Zobraz seznam položek z databáze UI čte data ListFragment DB sqlTuesday, March 19, 13
  92. 92. Architektura typické aplikace 1 •Zobraz seznam položek z databáze UI Model čte data ListFragment DB sqlTuesday, March 19, 13
  93. 93. DatabázeTuesday, March 19, 13nefunguji cizí klíčecasto implementovan jako singleton
  94. 94. Databáze •SQLite v3 databázeTuesday, March 19, 13nefunguji cizí klíčecasto implementovan jako singleton
  95. 95. Databáze •SQLite v3 databáze •SQLiteOpenHelperTuesday, March 19, 13nefunguji cizí klíčecasto implementovan jako singleton
  96. 96. Databáze •SQLite v3 databáze •SQLiteOpenHelper • stará se o life-cycle databázeTuesday, March 19, 13nefunguji cizí klíčecasto implementovan jako singleton
  97. 97. Databáze •SQLite v3 databáze •SQLiteOpenHelper • stará se o life-cycle databáze • callbacky pro vytvoření a upgradeTuesday, March 19, 13nefunguji cizí klíčecasto implementovan jako singleton
  98. 98. Databáze •SQLite v3 databáze •SQLiteOpenHelper • stará se o life-cycle databáze • callbacky pro vytvoření a upgrade • onCreate() a onUpgrade()Tuesday, March 19, 13nefunguji cizí klíčecasto implementovan jako singleton
  99. 99. Databáze •SQLite v3 databáze •SQLiteOpenHelper • stará se o life-cycle databáze • callbacky pro vytvoření a upgrade • onCreate() a onUpgrade() • zpřístupňuje interface databázeTuesday, March 19, 13nefunguji cizí klíčecasto implementovan jako singleton
  100. 100. Databáze •SQLite v3 databáze •SQLiteOpenHelper • stará se o life-cycle databáze • callbacky pro vytvoření a upgrade • onCreate() a onUpgrade() • zpřístupňuje interface databáze • getWritableDatabase()Tuesday, March 19, 13nefunguji cizí klíčecasto implementovan jako singleton
  101. 101. Databáze •SQLite v3 databáze •SQLiteOpenHelper • stará se o life-cycle databáze • callbacky pro vytvoření a upgrade • onCreate() a onUpgrade() • zpřístupňuje interface databáze • getWritableDatabase() • db.query(), db.insert (), db.update (), db.delete ()Tuesday, March 19, 13nefunguji cizí klíčecasto implementovan jako singleton
  102. 102. Databáze •SQLite v3 databáze •SQLiteOpenHelper • stará se o life-cycle databáze • callbacky pro vytvoření a upgrade • onCreate() a onUpgrade() • zpřístupňuje interface databáze • getWritableDatabase() • db.query(), db.insert (), db.update (), db.delete () • db.beginTransaction(), db.setTransactionSuccessful(), db.endTransaction()Tuesday, March 19, 13nefunguji cizí klíčecasto implementovan jako singleton
  103. 103. CursorTuesday, March 19, 13optimalizovane dotazy do databaze
  104. 104. Cursor •zpřístupňuje řádky výsledku db.query()Tuesday, March 19, 13optimalizovane dotazy do databaze
  105. 105. Cursor •zpřístupňuje řádky výsledku db.query() •metody pro pohybTuesday, March 19, 13optimalizovane dotazy do databaze
  106. 106. Cursor •zpřístupňuje řádky výsledku db.query() •metody pro pohyb • moveToFirst(), moveToNext(), getCount()Tuesday, March 19, 13optimalizovane dotazy do databaze
  107. 107. Cursor •zpřístupňuje řádky výsledku db.query() •metody pro pohyb • moveToFirst(), moveToNext(), getCount() •metody pro čteníTuesday, March 19, 13optimalizovane dotazy do databaze
  108. 108. Cursor •zpřístupňuje řádky výsledku db.query() •metody pro pohyb • moveToFirst(), moveToNext(), getCount() •metody pro čtení • getColumnIndex(String columnName)Tuesday, March 19, 13optimalizovane dotazy do databaze
  109. 109. Cursor •zpřístupňuje řádky výsledku db.query() •metody pro pohyb • moveToFirst(), moveToNext(), getCount() •metody pro čtení • getColumnIndex(String columnName) • getString(int columnIndex), ...Tuesday, March 19, 13optimalizovane dotazy do databaze
  110. 110. Cursor •zpřístupňuje řádky výsledku db.query() •metody pro pohyb • moveToFirst(), moveToNext(), getCount() •metody pro čtení • getColumnIndex(String columnName) • getString(int columnIndex), ... • db.query(table, columns, selection, selectionArgs,........)Tuesday, March 19, 13optimalizovane dotazy do databaze
  111. 111. Cursor •zpřístupňuje řádky výsledku db.query() •metody pro pohyb • moveToFirst(), moveToNext(), getCount() •metody pro čtení • getColumnIndex(String columnName) • getString(int columnIndex), ... • db.query(table, columns, selection, selectionArgs,........) • SimpleCursorAdapter, CursorAdapterTuesday, March 19, 13optimalizovane dotazy do databaze
  112. 112. Příklad 1.prozkoumejte DatabaseHelper 2.v MainFragment zobrazte seznam knizek v DB 1.hint: použijte Cursor a SimpleCursorAdapter •zdrojáky • muni-android-1 •dokumentace • http://goo.gl/eme2aTuesday, March 19, 13
  113. 113. Architektura typické aplikace 2 •Zobraz seznam položek z databázeTuesday, March 19, 13
  114. 114. Architektura typické aplikace 2 •Zobraz seznam položek z databáze ListFragmentTuesday, March 19, 13
  115. 115. Architektura typické aplikace 2 •Zobraz seznam položek z databáze ListFragment poskytuje data ContentProviderTuesday, March 19, 13
  116. 116. Architektura typické aplikace 2 •Zobraz seznam položek z databáze ListFragment poskytuje uri data ContentProviderTuesday, March 19, 13
  117. 117. Architektura typické aplikace 2 •Zobraz seznam položek z databáze ListFragment poskytuje uri data čte data ContentProvider DB sqlTuesday, March 19, 13
  118. 118. Architektura typické aplikace 2 •Zobraz seznam položek z databáze UI ListFragment poskytuje uri data čte data ContentProvider DB sqlTuesday, March 19, 13
  119. 119. Architektura typické aplikace 2 •Zobraz seznam položek z databáze UI ListFragment poskytuje data uri Model čte data ContentProvider DB sqlTuesday, March 19, 13
  120. 120. Architektura typické aplikace 2 •Zobraz seznam položek z databáze UI ListFragment poskytuje data uri Model čte data ContentProvider DB sql BoilerplateTuesday, March 19, 13
  121. 121. ContentProviderTuesday, March 19, 13
  122. 122. ContentProvider •Jednotné API pro přístup k modeluTuesday, March 19, 13
  123. 123. ContentProvider •Jednotné API pro přístup k modelu •Zapouzdřuje CRUD operace nad databázíTuesday, March 19, 13
  124. 124. ContentProvider •Jednotné API pro přístup k modelu •Zapouzdřuje CRUD operace nad databází •REST-like api a systém URITuesday, March 19, 13
  125. 125. ContentProvider •Jednotné API pro přístup k modelu •Zapouzdřuje CRUD operace nad databází •REST-like api a systém URI •Řeší synchronizaciTuesday, March 19, 13
  126. 126. ContentProvider •Jednotné API pro přístup k modelu •Zapouzdřuje CRUD operace nad databází •REST-like api a systém URI •Řeší synchronizaci •Poskytuje data jiným aplikacímTuesday, March 19, 13
  127. 127. Příklad 1.prozkoumejte komunikaci provideru a databáze 2.v Provider naimplementujte query operaci 3.v MainFragment načtěte data přes provider •zdrojáky • muni-android-2 •dokumentace • http://goo.gl/EFKK7Tuesday, March 19, 13
  128. 128. Architektura typické aplikace 3 •Zobraz seznam položek z databázeTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  129. 129. Architektura typické aplikace 3 •Zobraz seznam položek z databáze ListFragmentTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  130. 130. Architektura typické aplikace 3 •Zobraz seznam položek z databáze ListFragment načítání dat CursorLoaderTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  131. 131. Architektura typické aplikace 3 •Zobraz seznam položek z databáze ListFragment callback načítání dat y CursorLoaderTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  132. 132. Architektura typické aplikace 3 •Zobraz seznam položek z databáze ListFragment callback načítání dat y CursorLoader poskytuje data ContentProviderTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  133. 133. Architektura typické aplikace 3 •Zobraz seznam položek z databáze ListFragment callback načítání dat y CursorLoader poskytuje uri data ContentProviderTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  134. 134. Architektura typické aplikace 3 •Zobraz seznam položek z databáze ListFragment callback načítání dat y CursorLoader poskytuje uri data čte data ContentProvider DBTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  135. 135. Architektura typické aplikace 3 •Zobraz seznam položek z databáze ListFragment callback načítání dat y CursorLoader poskytuje uri data čte data ContentProvider DB sqlTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  136. 136. Architektura typické aplikace 3 •Zobraz seznam položek z databáze UI ListFragment callback načítání dat y CursorLoader poskytuje uri data čte data ContentProvider DB sqlTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  137. 137. Architektura typické aplikace 3 •Zobraz seznam položek z databáze UI ListFragment callback načítání dat y CursorLoader poskytuje data uri Model čte data ContentProvider DB sqlTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  138. 138. Architektura typické aplikace 3 •Zobraz seznam položek z databáze UI ListFragment callback načítání dat y Boilerplate CursorLoader poskytuje data uri Model čte data ContentProvider DB sqlTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  139. 139. Asynchroní operaceTuesday, March 19, 13
  140. 140. Asynchroní operace •Omezený programovací modelTuesday, March 19, 13
  141. 141. Asynchroní operace •Omezený programovací model • slabý procesorTuesday, March 19, 13
  142. 142. Asynchroní operace •Omezený programovací model • slabý procesor • multi-taskingTuesday, March 19, 13
  143. 143. Asynchroní operace •Omezený programovací model • slabý procesor • multi-tasking • aktualizace UI pouze v ui threaduTuesday, March 19, 13
  144. 144. Asynchroní operace •Omezený programovací model • slabý procesor • multi-tasking • aktualizace UI pouze v ui threadu • Application not responding aka. ANRTuesday, March 19, 13
  145. 145. Asynchroní operace •Omezený programovací model • slabý procesor • multi-tasking • aktualizace UI pouze v ui threadu • Application not responding aka. ANR • UI žije jenom chvíliTuesday, March 19, 13
  146. 146. Asynchroní operace •Omezený programovací model • slabý procesor • multi-tasking • aktualizace UI pouze v ui threadu • Application not responding aka. ANR • UI žije jenom chvíli •Vše, co může dlouho trvat, mimo ui threadTuesday, March 19, 13
  147. 147. Asynchroní operace •Omezený programovací model • slabý procesor • multi-tasking • aktualizace UI pouze v ui threadu • Application not responding aka. ANR • UI žije jenom chvíli •Vše, co může dlouho trvat, mimo ui thread • síťová komunikaceTuesday, March 19, 13
  148. 148. Asynchroní operace •Omezený programovací model • slabý procesor • multi-tasking • aktualizace UI pouze v ui threadu • Application not responding aka. ANR • UI žije jenom chvíli •Vše, co může dlouho trvat, mimo ui thread • síťová komunikace • čtení z databázeTuesday, March 19, 13
  149. 149. Asynchroní operace •Omezený programovací model • slabý procesor • multi-tasking • aktualizace UI pouze v ui threadu • Application not responding aka. ANR • UI žije jenom chvíli •Vše, co může dlouho trvat, mimo ui thread • síťová komunikace • čtení z databáze • čtení z filesystémuTuesday, March 19, 13
  150. 150. CursorLoaderTuesday, March 19, 13
  151. 151. CursorLoader •Čte z ContentProvideru na pozadíTuesday, March 19, 13
  152. 152. CursorLoader •Čte z ContentProvideru na pozadí •Activity/Fragment notifikováno callbackem • onCreateLoader() • onLoadFinished() • onLoadReset()Tuesday, March 19, 13
  153. 153. CursorLoader •Čte z ContentProvideru na pozadí •Activity/Fragment notifikováno callbackem • onCreateLoader() • onLoadFinished() • onLoadReset() •Umí reusovat jednou nahraný CursorTuesday, March 19, 13
  154. 154. CursorLoader •Čte z ContentProvideru na pozadí •Activity/Fragment notifikováno callbackem • onCreateLoader() • onLoadFinished() • onLoadReset() •Umí reusovat jednou nahraný Cursor •Obnoví Cursor při updatu modeluTuesday, March 19, 13
  155. 155. CursorLoader •Čte z ContentProvideru na pozadí •Activity/Fragment notifikováno callbackem • onCreateLoader() • onLoadFinished() • onLoadReset() •Umí reusovat jednou nahraný Cursor •Obnoví Cursor při updatu modelu •Je třeba volat v jako onActivityCreated() getActivity().getSupportLoaderManager().initLoader()Tuesday, March 19, 13
  156. 156. Příklad 1.nahraďte volání provideru CursorLoaderem 1.hint: fragment nechť implementuje LoaderManager.LoaderCallbacks 2.hint: použijte getActivity().getContentResolver() •zdrojáky • muni-android-3 •dokumentace • http://goo.gl/BBb2NTuesday, March 19, 13
  157. 157. Architektura typické aplikace 4 •Aktualizace z internetuTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  158. 158. Architektura typické aplikace 4 •Aktualizace z internetu ListFragment callback načítání dat y CursorLoader poskytuje uri data čte data ContentProvider DB sqlTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  159. 159. Architektura typické aplikace 4 •Aktualizace z internetu UI ListFragment callback načítání dat y CursorLoader poskytuje uri data čte data ContentProvider DB sqlTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  160. 160. Architektura typické aplikace 4 •Aktualizace z internetu UI ListFragment callback načítání dat y CursorLoader poskytuje data uri Model čte data ContentProvider DB sqlTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  161. 161. Architektura typické aplikace 4 •Aktualizace z internetu UI ListFragment callback načítání dat y CursorLoader poskytuje data uri Čtení Model čte data ContentProvider DB sqlTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  162. 162. Architektura typické aplikace 4 •Aktualizace z internetu ListFragment Inten IntentService t callback načítání dat y CursorLoader poskytuje uri data čte data ContentProvider DB sqlTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  163. 163. Architektura typické aplikace 4 •Aktualizace z internetu ListFragment Inten IntentService t callback provede načítání dat síťování y CursorLoader poskytuje sql, uri zapisuje data CV čte data ContentProvider DB sqlTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  164. 164. Architektura typické aplikace 4 •Aktualizace z internetu Aktualizace ListFragment Inten IntentService t callback provede načítání dat síťování y CursorLoader poskytuje sql, uri zapisuje data CV čte data ContentProvider DB sqlTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  165. 165. IntentServiceTuesday, March 19, 13parametry mozno predat bundlemkonci, pokud neni co zpracovavat,
  166. 166. IntentService •Implementuje frontu tasků za zpracovaníTuesday, March 19, 13parametry mozno predat bundlemkonci, pokud neni co zpracovavat,
  167. 167. IntentService •Implementuje frontu tasků za zpracovaní • onHandleIntent(Intent i)Tuesday, March 19, 13parametry mozno predat bundlemkonci, pokud neni co zpracovavat,
  168. 168. IntentService •Implementuje frontu tasků za zpracovaní • onHandleIntent(Intent i) •Impl. pomocí HandlerThread a HandlerTuesday, March 19, 13parametry mozno predat bundlemkonci, pokud neni co zpracovavat,
  169. 169. IntentService •Implementuje frontu tasků za zpracovaní • onHandleIntent(Intent i) •Impl. pomocí HandlerThread a Handler •Třeba definovat v manifestuTuesday, March 19, 13parametry mozno predat bundlemkonci, pokud neni co zpracovavat,
  170. 170. IntentService •Implementuje frontu tasků za zpracovaní • onHandleIntent(Intent i) •Impl. pomocí HandlerThread a Handler •Třeba definovat v manifestu •Volání přes Context.startService()Tuesday, March 19, 13parametry mozno predat bundlemkonci, pokud neni co zpracovavat,
  171. 171. IntentService •Implementuje frontu tasků za zpracovaní • onHandleIntent(Intent i) •Impl. pomocí HandlerThread a Handler •Třeba definovat v manifestu •Volání přes Context.startService() final Intent i = new Intent(getActivity(), MyService.class); getActivity().startService(i);Tuesday, March 19, 13parametry mozno predat bundlemkonci, pokud neni co zpracovavat,
  172. 172. SíťováníTuesday, March 19, 13
  173. 173. Síťování •Http Client, UrlConnectionTuesday, March 19, 13
  174. 174. Síťování •Http Client, UrlConnection try { final URL url = new URL("http://...."); final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); if (connection.getResponseCode() == 200) { final InputStream is = connection.getInputStream(); try { //TODO networking } finally { is.close(); } } } catch (IOException e) { // TODO: handle exception }Tuesday, March 19, 13
  175. 175. Síťování •Http Client, UrlConnection try { final URL url = new URL("http://...."); final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); if (connection.getResponseCode() == 200) { final InputStream is = connection.getInputStream(); try { //TODO networking } finally { is.close(); } } } catch (IOException e) { // TODO: handle exception }Tuesday, March 19, 13
  176. 176. Síťování •Http Client, UrlConnection try { final URL url = new URL("http://...."); final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); if (connection.getResponseCode() == 200) { final InputStream is = connection.getInputStream(); try { //TODO networking } finally { is.close(); } } } catch (IOException e) { // TODO: handle exception } •Oprávnění • android.permission.INTERNETTuesday, March 19, 13
  177. 177. Parsování a db insertTuesday, March 19, 13
  178. 178. Parsování a db insert •JSON - JSONObject, JSONArrayTuesday, March 19, 13
  179. 179. Parsování a db insert •JSON - JSONObject, JSONArray • getString(), getInt(), getDouble()Tuesday, March 19, 13
  180. 180. Parsování a db insert •JSON - JSONObject, JSONArray • getString(), getInt(), getDouble() •XMLTuesday, March 19, 13
  181. 181. Parsování a db insert •JSON - JSONObject, JSONArray • getString(), getInt(), getDouble() •XML • android.util.XMLTuesday, March 19, 13
  182. 182. Parsování a db insert •JSON - JSONObject, JSONArray • getString(), getInt(), getDouble() •XML • android.util.XML • android.sax.RootElementTuesday, March 19, 13
  183. 183. Parsování a db insert •JSON - JSONObject, JSONArray • getString(), getInt(), getDouble() •XML • android.util.XML • android.sax.RootElement •ContentValuesTuesday, March 19, 13
  184. 184. Parsování a db insert •JSON - JSONObject, JSONArray • getString(), getInt(), getDouble() •XML • android.util.XML • android.sax.RootElement •ContentValues • db.insert()Tuesday, March 19, 13
  185. 185. Parsování a db insert •JSON - JSONObject, JSONArray • getString(), getInt(), getDouble() •XML • android.util.XML • android.sax.RootElement •ContentValues • db.insert() • getContentResolver.notify(Uri,...)Tuesday, March 19, 13
  186. 186. Příklad 1.Přes RefreshService aktualizujte tabulku Books 2.http://dl.dropbox.com/u/5296640/ books.json •zdrojáky • muni-android-4 •dokumentace • http://goo.gl/3EeeTuesday, March 19, 13
  187. 187. Architektura typické aplikace 5 •Operace create, update, deleteTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  188. 188. Architektura typické aplikace 5 •Operace create, update, delete ListFragment callback načítání dat y CursorLoader poskytuje uri data čte data ContentProvider DB sqlTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  189. 189. Architektura typické aplikace 5 •Operace create, update, delete UI ListFragment callback načítání dat y CursorLoader poskytuje uri data čte data ContentProvider DB sqlTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  190. 190. Architektura typické aplikace 5 •Operace create, update, delete UI ListFragment callback načítání dat y CursorLoader poskytuje data uri Model čte data ContentProvider DB sqlTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  191. 191. Architektura typické aplikace 5 •Operace create, update, delete UI ListFragment callback načítání dat y CursorLoader poskytuje data uri Čtení Model čte data ContentProvider DB sqlTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  192. 192. Architektura typické aplikace 5 •Operace create, update, delete čte data ListFragment AsyncQueryHandl uri, CV callback načítání dat y CursorLoader poskytuje uri data čte data ContentProvider DB sqlTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  193. 193. Architektura typické aplikace 5 •Operace create, update, delete čte data ListFragment AsyncQueryHandl uri, CV callback provede c, u, načítání dat uri, CV y d CursorLoader ContentProvider poskytuje uri data čte data ContentProvider DB sqlTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  194. 194. Architektura typické aplikace 5 •Operace create, update, delete čte data ListFragment AsyncQueryHandl uri, CV callback provede c, u, načítání dat uri, CV y d CursorLoader ContentProvider poskytuje sql, uri zapisuje data CV čte data ContentProvider DB sqlTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  195. 195. Architektura typické aplikace 5 •Operace create, update, delete Zápis čte data ListFragment AsyncQueryHandl uri, CV callback provede c, u, načítání dat uri, CV y d CursorLoader ContentProvider poskytuje sql, uri zapisuje data CV čte data ContentProvider DB sqlTuesday, March 19, 13můžeme vyřešit update modeluaktivita je hloupe ui
  196. 196. AsyncQueryHandlerTuesday, March 19, 13
  197. 197. AsyncQueryHandler •Volá crud operace v threadu na pozadíTuesday, March 19, 13
  198. 198. AsyncQueryHandler •Volá crud operace v threadu na pozadí •Zpětně notifikuje volajícíhoTuesday, March 19, 13
  199. 199. AsyncQueryHandler •Volá crud operace v threadu na pozadí •Zpětně notifikuje volajícího •Problém - volající nemusí již existovatTuesday, March 19, 13
  200. 200. AsyncQueryHandler •Volá crud operace v threadu na pozadí •Zpětně notifikuje volajícího •Problém - volající nemusí již existovat •ŘešeníTuesday, March 19, 13
  201. 201. AsyncQueryHandler •Volá crud operace v threadu na pozadí •Zpětně notifikuje volajícího •Problém - volající nemusí již existovat •Řešení • Implementovat jako inner-static nebo top- levelTuesday, March 19, 13
  202. 202. AsyncQueryHandler •Volá crud operace v threadu na pozadí •Zpětně notifikuje volajícího •Problém - volající nemusí již existovat •Řešení • Implementovat jako inner-static nebo top- level • WeakReference pro odkaz na volajícíhoTuesday, March 19, 13
  203. 203. AsyncQueryHandler •Volá crud operace v threadu na pozadí •Zpětně notifikuje volajícího •Problém - volající nemusí již existovat •Řešení • Implementovat jako inner-static nebo top- level • WeakReference pro odkaz na volajícího private class MyQueryHandler extends AsyncQueryHandler { // Use weak reference to avoid memoey leak private WeakReference<MyActivity> mMyActivity; public MyQueryHandler(Context context) { super(context.getContentResolver()); mMyActivity = new WeakReference<MyActivity>((MyActivity) context); } protected void onQueryComplete(int token, Object cookie, Cursor cursor) { MyActivity activity = mMyActivity.get(); if (activity != null && !activity.isFinishing()) { ... } }Tuesday, March 19, 13
  204. 204. Příklad 1.Doplňte c, u, d operace do provideru a fragmentu •zdrojáky • muni-android-5 •dokumentace • http://goo.gl/BS1hrTuesday, March 19, 13
  205. 205. Děkuji @ondraz ukázky kódu a obrázky pocházejí z http://developer.android.com pod licencemi Apache v2.0 a Creative Commons Attribution v2.5Tuesday, March 19, 13

×