2. Agenda
Tuesday, March 19, 13
nejdrive trochu teorie, potom prakticky priklad
prvni dva priklady se tykaji UI, druhe dva pak programovani
behem prikladu budu obchazet a pomahat
3. Agenda
1.Rekapitulace z minula
Tuesday, March 19, 13
nejdrive trochu teorie, potom prakticky priklad
prvni dva priklady se tykaji UI, druhe dva pak programovani
behem prikladu budu obchazet a pomahat
4. Agenda
1.Rekapitulace z minula
2.BroadcastReceiver
Tuesday, March 19, 13
nejdrive trochu teorie, potom prakticky priklad
prvni dva priklady se tykaji UI, druhe dva pak programovani
behem prikladu budu obchazet a pomahat
5. Agenda
1.Rekapitulace z minula
2.BroadcastReceiver
3.Podpora různých zařízení
Tuesday, March 19, 13
nejdrive trochu teorie, potom prakticky priklad
prvni dva priklady se tykaji UI, druhe dva pak programovani
behem prikladu budu obchazet a pomahat
6. Agenda
1.Rekapitulace z minula
2.BroadcastReceiver
3.Podpora různých zařízení
4.Dynamické UI pomocí fragmentů
Tuesday, March 19, 13
nejdrive trochu teorie, potom prakticky priklad
prvni dva priklady se tykaji UI, druhe dva pak programovani
behem prikladu budu obchazet a pomahat
7. Agenda
1.Rekapitulace z minula
2.BroadcastReceiver
3.Podpora různých zařízení
4.Dynamické UI pomocí fragmentů
5.Přestávka
Tuesday, March 19, 13
nejdrive trochu teorie, potom prakticky priklad
prvni dva priklady se tykaji UI, druhe dva pak programovani
behem prikladu budu obchazet a pomahat
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é aplikace
Tuesday, March 19, 13
nejdrive trochu teorie, potom prakticky priklad
prvni dva priklady se tykaji UI, druhe dva pak programovani
behem prikladu budu obchazet a pomahat
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ědi
Tuesday, March 19, 13
nejdrive trochu teorie, potom prakticky priklad
prvni dva priklady se tykaji UI, druhe dva pak programovani
behem prikladu budu obchazet a pomahat
10. House-keeping notes
•slajdy - http://goo.gl/QiFDy
•zdroje - http://goo.gl/QH5J7
•vaše otázky
Tuesday, March 19, 13
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.Debugging
Tuesday, March 19, 13
12. Broadcasty
Tuesday, March 19, 13
aplikaci to i probudí
vykonat rychlou akci (limit 10s)
mozno broadcasty radit i stopnout
13. Broadcasty
•Aplikace reaguje na důležité události
Tuesday, March 19, 13
aplikaci to i probudí
vykonat rychlou akci (limit 10s)
mozno broadcasty radit i stopnout
14. Broadcasty
•Aplikace reaguje na důležité události
• Boot, SMS, Call, připojení, čas...
Tuesday, March 19, 13
aplikaci to i probudí
vykonat rychlou akci (limit 10s)
mozno broadcasty radit i stopnout
15. Broadcasty
•Aplikace reaguje na důležité události
• Boot, SMS, Call, připojení, čas...
•BroadcastReceiver
Tuesday, March 19, 13
aplikaci to i probudí
vykonat rychlou akci (limit 10s)
mozno broadcasty radit i stopnout
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, 13
aplikaci to i probudí
vykonat rychlou akci (limit 10s)
mozno broadcasty radit i stopnout
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, 13
aplikaci to i probudí
vykonat rychlou akci (limit 10s)
mozno broadcasty radit i stopnout
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, 13
aplikaci to i probudí
vykonat rychlou akci (limit 10s)
mozno broadcasty radit i stopnout
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, 13
aplikaci to i probudí
vykonat rychlou akci (limit 10s)
mozno broadcasty radit i stopnout
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, 13
aplikaci to i probudí
vykonat rychlou akci (limit 10s)
mozno broadcasty radit i stopnout
22. Příklad
•Vypište číslo a text příchozí sms v toastu
Tuesday, March 19, 13
23. Příklad
•Vypište číslo a text příchozí sms v toastu
• Toast - http://goo.gl/WoTk
Tuesday, March 19, 13
24. Příklad
•Vypište číslo a text příchozí sms v toastu
• Toast - http://goo.gl/WoTk
• Oprávnění android.permission.RECEIVE_SMS
Tuesday, March 19, 13
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 smsek
Tuesday, March 19, 13
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.createFromPdu
Tuesday, March 19, 13
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átoru
Tuesday, March 19, 13
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-hello
Tuesday, March 19, 13
30. Různá zařízení
•deklarativně podadresáři v /res
Tuesday, March 19, 13
31. Různá zařízení
•deklarativně podadresáři v /res
•defaultní a alternativní
Tuesday, March 19, 13
32. Různá zařízení
•deklarativně podadresáři v /res
•defaultní a alternativní
dvě zařízení
jeden layout
Tuesday, March 19, 13
33. Různá zařízení
•deklarativně podadresáři v /res
•defaultní a alternativní
dvě zařízení
jeden layout
jedno zařízení
dva layouty
Tuesday, March 19, 13
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. 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 we're 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. 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/RKihT
Tuesday, March 19, 13
68. Dynamické UI pomocí fragmentů
•Fragment je kus funkčního UI
•Aktivita hostí fragmenty
•Jedna aplikace pro telefon i tablet
Tuesday, March 19, 13
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. 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. 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
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. 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. 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
82. Komunikace mezi fragmenty
•FragmentA definuje Listener interface
•Activity interface implementuje
Tuesday, March 19, 13
83. Komunikace mezi fragmenty
•FragmentA definuje Listener interface
•Activity interface implementuje
•FragmentA volá callback onItemSelected(...)
Tuesday, March 19, 13
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
•Animations
Tuesday, March 19, 13
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/bK5GQ
Tuesday, March 19, 13
94. Databáze
•SQLite v3 databáze
Tuesday, March 19, 13
nefunguji cizí klíče
casto implementovan jako singleton
95. Databáze
•SQLite v3 databáze
•SQLiteOpenHelper
Tuesday, March 19, 13
nefunguji cizí klíče
casto implementovan jako singleton
96. Databáze
•SQLite v3 databáze
•SQLiteOpenHelper
• stará se o life-cycle databáze
Tuesday, March 19, 13
nefunguji cizí klíče
casto implementovan jako singleton
97. Databáze
•SQLite v3 databáze
•SQLiteOpenHelper
• stará se o life-cycle databáze
• callbacky pro vytvoření a upgrade
Tuesday, March 19, 13
nefunguji cizí klíče
casto implementovan jako singleton
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, 13
nefunguji cizí klíče
casto implementovan jako singleton
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áze
Tuesday, March 19, 13
nefunguji cizí klíče
casto implementovan jako singleton
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, 13
nefunguji cizí klíče
casto implementovan jako singleton
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, 13
nefunguji cizí klíče
casto implementovan jako singleton
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, 13
nefunguji cizí klíče
casto implementovan jako singleton
104. Cursor
•zpřístupňuje řádky výsledku db.query()
Tuesday, March 19, 13
optimalizovane dotazy do databaze
105. Cursor
•zpřístupňuje řádky výsledku db.query()
•metody pro pohyb
Tuesday, March 19, 13
optimalizovane dotazy do databaze
106. Cursor
•zpřístupňuje řádky výsledku db.query()
•metody pro pohyb
• moveToFirst(), moveToNext(), getCount()
Tuesday, March 19, 13
optimalizovane dotazy do databaze
107. Cursor
•zpřístupňuje řádky výsledku db.query()
•metody pro pohyb
• moveToFirst(), moveToNext(), getCount()
•metody pro čtení
Tuesday, March 19, 13
optimalizovane dotazy do databaze
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, 13
optimalizovane dotazy do databaze
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, 13
optimalizovane dotazy do databaze
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, 13
optimalizovane dotazy do databaze
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, CursorAdapter
Tuesday, March 19, 13
optimalizovane dotazy do databaze
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/eme2a
Tuesday, March 19, 13
115. Architektura typické aplikace 2
•Zobraz seznam položek z databáze
ListFragment
poskytuje
data
ContentProvider
Tuesday, March 19, 13
116. Architektura typické aplikace 2
•Zobraz seznam položek z databáze
ListFragment
poskytuje
uri
data
ContentProvider
Tuesday, March 19, 13
117. Architektura typické aplikace 2
•Zobraz seznam položek z databáze
ListFragment
poskytuje
uri
data
čte data
ContentProvider DB
sql
Tuesday, March 19, 13
118. Architektura typické aplikace 2
•Zobraz seznam položek z databáze
UI
ListFragment
poskytuje
uri
data
čte data
ContentProvider DB
sql
Tuesday, March 19, 13
119. Architektura typické aplikace 2
•Zobraz seznam položek z databáze
UI
ListFragment
poskytuje
data
uri Model
čte data
ContentProvider DB
sql
Tuesday, March 19, 13
120. Architektura typické aplikace 2
•Zobraz seznam položek z databáze
UI
ListFragment
poskytuje
data
uri Model
čte data
ContentProvider DB
sql
Boilerplate
Tuesday, March 19, 13
122. ContentProvider
•Jednotné API pro přístup k modelu
Tuesday, March 19, 13
123. ContentProvider
•Jednotné API pro přístup k modelu
•Zapouzdřuje CRUD operace nad databází
Tuesday, March 19, 13
124. ContentProvider
•Jednotné API pro přístup k modelu
•Zapouzdřuje CRUD operace nad databází
•REST-like api a systém URI
Tuesday, March 19, 13
125. ContentProvider
•Jednotné API pro přístup k modelu
•Zapouzdřuje CRUD operace nad databází
•REST-like api a systém URI
•Řeší synchronizaci
Tuesday, March 19, 13
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ím
Tuesday, March 19, 13
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/EFKK7
Tuesday, March 19, 13
128. Architektura typické aplikace 3
•Zobraz seznam položek z databáze
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
129. Architektura typické aplikace 3
•Zobraz seznam položek z databáze
ListFragment
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
130. Architektura typické aplikace 3
•Zobraz seznam položek z databáze
ListFragment
načítání dat
CursorLoader
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
131. Architektura typické aplikace 3
•Zobraz seznam položek z databáze
ListFragment
callback
načítání dat
y
CursorLoader
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
132. Architektura typické aplikace 3
•Zobraz seznam položek z databáze
ListFragment
callback
načítání dat
y
CursorLoader
poskytuje
data
ContentProvider
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
133. Architektura typické aplikace 3
•Zobraz seznam položek z databáze
ListFragment
callback
načítání dat
y
CursorLoader
poskytuje
uri
data
ContentProvider
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
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 DB
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
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
sql
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
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
sql
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
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
sql
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
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
sql
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
141. Asynchroní operace
•Omezený programovací model
• slabý procesor
Tuesday, March 19, 13
142. Asynchroní operace
•Omezený programovací model
• slabý procesor
• multi-tasking
Tuesday, March 19, 13
143. Asynchroní operace
•Omezený programovací model
• slabý procesor
• multi-tasking
• aktualizace UI pouze v ui threadu
Tuesday, March 19, 13
144. Asynchroní operace
•Omezený programovací model
• slabý procesor
• multi-tasking
• aktualizace UI pouze v ui threadu
• Application not responding aka. ANR
Tuesday, March 19, 13
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íli
Tuesday, March 19, 13
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 thread
Tuesday, March 19, 13
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á komunikace
Tuesday, March 19, 13
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áze
Tuesday, March 19, 13
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ému
Tuesday, March 19, 13
151. CursorLoader
•Čte z ContentProvideru na pozadí
Tuesday, March 19, 13
152. CursorLoader
•Čte z ContentProvideru na pozadí
•Activity/Fragment notifikováno callbackem
• onCreateLoader()
• onLoadFinished()
• onLoadReset()
Tuesday, March 19, 13
153. CursorLoader
•Čte z ContentProvideru na pozadí
•Activity/Fragment notifikováno callbackem
• onCreateLoader()
• onLoadFinished()
• onLoadReset()
•Umí reusovat jednou nahraný Cursor
Tuesday, March 19, 13
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 modelu
Tuesday, March 19, 13
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
157. Architektura typické aplikace 4
•Aktualizace z internetu
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
158. Architektura typické aplikace 4
•Aktualizace z internetu
ListFragment
callback
načítání dat
y
CursorLoader
poskytuje
uri
data
čte data
ContentProvider DB
sql
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
159. Architektura typické aplikace 4
•Aktualizace z internetu
UI
ListFragment
callback
načítání dat
y
CursorLoader
poskytuje
uri
data
čte data
ContentProvider DB
sql
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
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
sql
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
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
sql
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
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
sql
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
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
sql
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
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
sql
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
166. IntentService
•Implementuje frontu tasků za zpracovaní
Tuesday, March 19, 13
parametry mozno predat bundlem
konci, pokud neni co zpracovavat,
167. IntentService
•Implementuje frontu tasků za zpracovaní
• onHandleIntent(Intent i)
Tuesday, March 19, 13
parametry mozno predat bundlem
konci, pokud neni co zpracovavat,
168. IntentService
•Implementuje frontu tasků za zpracovaní
• onHandleIntent(Intent i)
•Impl. pomocí HandlerThread a Handler
Tuesday, March 19, 13
parametry mozno predat bundlem
konci, pokud neni co zpracovavat,
169. IntentService
•Implementuje frontu tasků za zpracovaní
• onHandleIntent(Intent i)
•Impl. pomocí HandlerThread a Handler
•Třeba definovat v manifestu
Tuesday, March 19, 13
parametry mozno predat bundlem
konci, pokud neni co zpracovavat,
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, 13
parametry mozno predat bundlem
konci, pokud neni co zpracovavat,
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, 13
parametry mozno predat bundlem
konci, pokud neni co zpracovavat,
187. Architektura typické aplikace 5
•Operace create, update, delete
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
188. Architektura typické aplikace 5
•Operace create, update, delete
ListFragment
callback
načítání dat
y
CursorLoader
poskytuje
uri
data
čte data
ContentProvider DB
sql
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
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
sql
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
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
sql
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
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
sql
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
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
sql
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
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
sql
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
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
sql
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
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
sql
Tuesday, March 19, 13
můžeme vyřešit update modelu
aktivita je hloupe ui
197. AsyncQueryHandler
•Volá crud operace v threadu na pozadí
Tuesday, March 19, 13
198. AsyncQueryHandler
•Volá crud operace v threadu na pozadí
•Zpětně notifikuje volajícího
Tuesday, March 19, 13
199. AsyncQueryHandler
•Volá crud operace v threadu na pozadí
•Zpětně notifikuje volajícího
•Problém - volající nemusí již existovat
Tuesday, March 19, 13
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. 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
Tuesday, March 19, 13
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ího
Tuesday, March 19, 13
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. Příklad
1.Doplňte c, u, d operace do provideru a
fragmentu
•zdrojáky
• muni-android-5
•dokumentace
• http://goo.gl/BS1hr
Tuesday, March 19, 13
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.5
Tuesday, March 19, 13