Slide 1

Slide 1 text

What’s new in
 Architecture Components I/0 ’19 Extended Pangyo Sa-ryong Kang

Slide 2

Slide 2 text

Who is this guy? • ҃۱ 19֙ର SW ূ૑פয • ತস ੹ޙо: ޷Ҵীࢲ ೠ ߣ, ೠҴীࢲ ف ߣ झఋ౟স ହস ҃೷ • IBM iX Japanীࢲ Android/iOS ׸׼ Senior Specialist۽ Ӕޖ ઺ • YouTubeীࢲ ݅աਃ! • Droid Knights 2018 - ղо উ٘۽੉٘ ূ૑פযо غ঻ਸ ٸ ইޖب ঌ۰઱ ૑ ঋ਷ Ѫٜ • Droid Nights 2019 - Android Architecture ୨੿ܻ

Slide 3

Slide 3 text

• Data Binding • View Binding • Life Cycle + ViewModel • WorkManager • Room • Paging • Navigation ݾର

Slide 4

Slide 4 text

Data Binding

Slide 5

Slide 5 text

• Annotation Processing ࢿמ ೱ࢚: 20% • ࠙࢑ ஹ౵ੌ நद ૑ਗ • Incremental Annotation Processing੄ ࣻഌ੗ • Android Studio৬੄ োز ъച • XML ղਊ੄ ૊द ߈৔ • XMLীࢲ UIਃࣗܳ ୶оೞݶ, ஹ౵ੌ হ੉ب ೙٘о ୶оؽ • ܻಂష݂ ӝמ੉ XMLীب ੸ਊ Data Binding (3.5~)

Slide 6

Slide 6 text

• ஹ౵ੌ ী۞ ಴द ѐࢶ • 1000ѐ੄ ী۞ݫद૑ ਬഋ ୶о Data Binding (3.5~)

Slide 7

Slide 7 text

Data Binding (3.5~) class MainActivity : AppCompatActivity() { private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) } }

Slide 8

Slide 8 text

Data Binding (3.5~) class MainActivity : AppCompatActivity() { private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) } } public abstract class ActivityMainBinding extends ViewDataBinding { @NonNull public final TextView textView; protected ActivityMainBinding(Object _bindingComponent, View _root, int _localFieldCount, TextView textView) { super(_bindingComponent, _root, _localFieldCount); this.textView = textView; } ~~~~~~~~~~~~~~~

Slide 9

Slide 9 text

Data Binding (3.5~) class MainActivity : AppCompatActivity() { private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) } }

Slide 10

Slide 10 text

Data Binding (3.5~) class MainActivity : AppCompatActivity() { private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) binding.textView } }

Slide 11

Slide 11 text

• DataBinding ࢎਊ੄ о੢ ௾ ೲٜ੉ ݽف ઁѢ (ই݃ب..) • ؀۝੄ ߡӒب ೣԋ ࣗѐؼ оמࢿ ֪റ.. • ࠁ׮ ViewModel ׮਍ ViewModelਸ ݅٘ח ؘী ݆਷ ب਑੉ ؼ ٠ Implication

Slide 12

Slide 12 text

View Binding

Slide 13

Slide 13 text

View Binding (3.6~)

Slide 14

Slide 14 text

View Binding (3.6~)

Slide 15

Slide 15 text

View Binding (3.6~)

Slide 16

Slide 16 text

• DataBindingҗ੄ ഐജࢿ • XML ਃࣗ੄ ੽Ӕ݅ਸ ࢎਊೞҊ र׮ݶ, औѱ ViewBindingਵ۽ тইఎ ࣻ ੓਺ • కӒ݅ ઁѢೞݶ ؽ • ࢎਊߨب, ޙߨب ৮੹ زੌ • ߈؀۽, ୊਺ بੑೠ׮ݶ XML਷ ইޖ Ѫب ࣻ੿ೡ ೙ਃ হ੉ Data Bindingҗ ڙ э਷ ࢶ঱ ف ઴۽ ࢎਊ оמ • Kotlin Extensionী ؀ೠ ೤ܻ੸ ؀উ View Binding (3.6~)

Slide 17

Slide 17 text

• Kotlin Synthetic Extension, Butter Knifeী ؀ೠ ೤ܻ੸ ؀উ • Gradle Pluginী ੄೧ ௿ېझܳ ࢤࢿೞҊ ੉ח Android Studioীࢲ ಞ૘ ઺ী ੌয ա޲۽.. • Compile time safety / Build speed নଃীࢲ ੉ٙ • Data Bindingب э਷ ݒழפ્੄ ࣻഌܳ যו ੿ب ߉ਸ ٠ Implication

Slide 18

Slide 18 text

Life Cycle + ViewModel

Slide 19

Slide 19 text

View Model class MainViewModel : ViewModel() { val counter = MutableLiveData(0) } class MainActivity : AppCompatActivity() { private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) } }

Slide 20

Slide 20 text

View Model class MainViewModel : ViewModel() { val counter = MutableLiveData(0) } class MainActivity : AppCompatActivity() { private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) } private val viewModel by viewModels() { } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) } }

Slide 21

Slide 21 text

View Model class MainViewModel : ViewModel() { val counter = MutableLiveData(0) } class MainActivity : AppCompatActivity() { private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) } private val viewModel by viewModels() { } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) viewModel.counter .observe(this, Observer { binding.textView.text = "count = $it" }) } }

Slide 22

Slide 22 text

View Model class MainViewModel : ViewModel() { val counter = MutableLiveData(0) } class MainActivity : AppCompatActivity() { private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) } private val viewModel by viewModels() { } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) viewModel.counter .observe(this) { binding.textView.text = "count = $it" } } } lifecycle-livedata-core-ktx lifecycle-livedata-core-ktx

Slide 23

Slide 23 text

View Model class MainViewModel : ViewModel() { val counter = MutableLiveData(0) } class MainActivity : AppCompatActivity() { private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) } private val viewModel by viewModels() { } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) viewModel.counter .observe(this) { binding.textView.text = "count = $it" } binding.countButton.setOnClickListener { viewModel.counter.apply { value = value?.plus(1) ?: 1 } } } }

Slide 24

Slide 24 text

View Model override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) viewModel.counter.value?.also { outState.putInt("counter", it) } } override fun onRestoreInstanceState(savedInstanceState: Bundle?) { super.onRestoreInstanceState(savedInstanceState) savedInstanceState ?: return viewModel.counter.value = savedInstanceState.getInt("counter") }

Slide 25

Slide 25 text

View Model class MainViewModel( handle: SavedStateHandle ) : ViewModel() { val counter: MutableLiveData = handle.getLiveData("counter") } class MainActivity : AppCompatActivity() { private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) } private val viewModel by viewModels { SavedStateVMFactory(this, bundleOf("counter” to 0)) } }

Slide 26

Slide 26 text

• ই૒ ߓ Ҋ೐׮.. • ࢜۽ द੘ೞח ೐۽ં౟ or ѐੋ/ࣗӏݽ ઑ૒ীח ݫܻ౟о ੓ѷਵա.. • ӝઓ ҳഅਸ ыҊ ੓ח ҃਋, AAC ViewModel۽ ৤ѹఋঠೡ ഛҊೠ ݫܻ౟ח ই ૒ হח ٠ Implication

Slide 27

Slide 27 text

WorkManager

Slide 28

Slide 28 text

• What is it? • Background processing that is deferrable, persistent, constraint-based and backward compatible. • 1.0੉ 3ਘ 1ੌ ୹द ع਺.. which means.. ೡ݆ঋ • 2.0ب زद ୹द ع਺.. WTF? Work Manager

Slide 29

Slide 29 text

• On-demand Initialization (2.1.0) • App ௿ېझী ജ҃ ࢸ੿ ҙ۲ ղਊਸ ҳഅ • ੋझఢझ ஂٙ दী contextܳ ֈѹ.. ೙ਃೡ ٸী ੋझఢझо ࢤࢿ ؽ • Google Play Service৬੄ ా೤ (ழ߁.. २ & optional) - ҳഋ ױ݈ীࢲ੄ ࢿמ ೱ࢚ • ഐജࢿ ѐࢶ (ongoing) • ӝӝী ٮܲ ز੘੄ ର੉: ࢎਊ੗о ૒੽ জਸ ઙܐೞݶ.. • Pixel → ೐۽ࣁझ ઙܐ. যڃ ױ݈ٜ → force stop (job੉ ࢎۄઉߡܿ-0-; FCMب..;;;) Work Manager

Slide 30

Slide 30 text

• Test Support • Robolectric Support (Available now!) • Unit Test Support in alpha (2.1.0): 
 TestWorkerBuilder, TestListenableWorkerBuilder • Foreground Support! • Job Scheduler۽ 10࠙ ૞ܻ স۽٘ө૑ ೡ ࣻ ੓૑݅, ӒѪࠁ׮ ӡ׮ݶ? • োղ ୹द ৘੿ Work Manager

Slide 31

Slide 31 text

Room

Slide 32

Slide 32 text

• Coroutine ૑ਗ: Cancelableೠ ௏٘ ࢤࢿ оמ • Transactionب naturalೞѱ ҳഅ оמ • Full-text Search • SQLite ഛ੢ӝמ Room 2.1

Slide 33

Slide 33 text

• RxJava ૑ਗ! • Ӕؘ Flowable੉ غח૑ח ࠛݺഛ • View ࢤࢿ оמ Room 2.1

Slide 34

Slide 34 text

• ӒܻҊ ખ ؊ ٍীח.. • Incremental Annotation Processing ૑ਗ • Many-to-many Relation ૑ਗ • ݃੉Ӓۨ੉࣌ਸ ࠁ׮ औѱ.. • Coroutines Channel/Flow ૑ਗ Room

Slide 35

Slide 35 text

Etc. : Paging & Navigation

Slide 36

Slide 36 text

• Before • RecyclerViewী ܻझ౟ܳ lazy load ೧઱ח ۄ੉࠳۞ܻ, but.. • Room, Realm, Retrofit ૑ਗ • Soon in EAP, alpha this summer • Built in network ૑ਗ with ী۞ ೩ٜ݂ • ೻؊ / footer ૑ਗ • RxJava / Coroutines ా೤ ъച! Paging

Slide 37

Slide 37 text

• 3/19 1.0, 2.0 ୹द • 2.1 • ViewModels scoped to Navigation Graphs • Navigation by URI • Dialog • Future • Dynamic Delivery ૑ਗ Navigation

Slide 38

Slide 38 text

Conclusion

Slide 39

Slide 39 text

• ☀ • MVVM with Data Binding • Coroutine • Redux-like architecture for Jetpack Compose • Many companies have already adopt it, such as Netflix • ⛈ • Schedule for other libraries can be postponed, because of tough competition between Swift UI and Jetpack Compose. • Already happened last year: Some of promise in 2018 were not yet kept, because of AS 3.4/3.5 and R8 Forecast (in my personal opinion)

Slide 40

Slide 40 text

Thank you very much!