Share
Embed
Transcript
40 slides
-
Who is this guy? • ҃۱ 19֙ର SW ূפয •
ತস ޙо: Ҵীࢲ ೠ ߣ, ೠҴীࢲ ف ߣ झఋস ହস ҃ • IBM iX Japanীࢲ Android/iOS Senior Specialist۽ Ӕޖ • YouTubeীࢲ ݅աਃ! • Droid Knights 2018 - ղо উ٘۽٘ ূפযо غਸ ٸ ইޖب ঌ۰ ঋ Ѫٜ • Droid Nights 2019 - Android Architecture ୨ܻ -
• Data Binding • View Binding • Life Cycle +
ViewModel • WorkManager • Room • Paging • Navigation ݾର -
• Annotation Processing ࢿמ ೱ࢚: 20% • ࠙ ஹੌ நद
ਗ • Incremental Annotation Processing ࣻഌ • Android Studio৬ োز ъച • XML ղਊ द ߈ • XMLীࢲ UIਃࣗܳ ୶оೞݶ, ஹੌ হب ٘о ୶оؽ • ܻಂష݂ ӝמ XMLীب ਊ Data Binding (3.5~) -
• ஹੌ ী۞ द ѐࢶ • 1000ѐ ী۞ݫद ਬഋ ୶о
Data Binding (3.5~) -
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) } } -
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; } ~~~~~~~~~~~~~~~ -
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) } } <?xml version="1.0" encoding="utf-8"?> <layout> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout> </layout> -
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 } } <?xml version="1.0" encoding="utf-8"?> <layout> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout> </layout> -
• DataBinding ࢎਊ о ೲٜ ݽف ઁѢ (ই݃ب..) •
ߡӒب ೣԋ ࣗѐؼ оמࢿ ֪റ.. • ࠁ ViewModel ViewModelਸ ݅٘ח ؘী ݆ ب ؼ ٠ Implication -
• DataBindingҗ ഐജࢿ • XML ਃࣗ Ӕ݅ਸ ࢎਊೞҊ रݶ, औѱ
ViewBindingਵ۽ тইఎ ࣻ • <layout></layout> కӒ݅ ઁѢೞݶ ؽ • ࢎਊߨب, ޙߨب ৮ زੌ • ߈۽, بੑೠݶ XML ইޖ Ѫب ࣻೡ ਃ হ Data Bindingҗ ڙ э ࢶ ف ۽ ࢎਊ оמ • Kotlin Extensionী ೠ ܻ উ View Binding (3.6~) -
• Kotlin Synthetic Extension, Butter Knifeী ೠ ܻ উ •
Gradle Pluginী ೧ ېझܳ ࢤࢿೞҊ ח Android Studioীࢲ ಞ ী ੌয ա۽.. • Compile time safety / Build speed নଃীࢲ ٙ • Data Bindingب э ݒழפ્ ࣻഌܳ যו ب ߉ਸ ٠ Implication -
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) } } -
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<MainViewModel>() { } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) } } -
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<MainViewModel>() { } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) viewModel.counter .observe(this, Observer { binding.textView.text = "count = $it" }) } } -
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<MainViewModel>() { } 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 -
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<MainViewModel>() { } 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 } } } } -
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") } -
View Model class MainViewModel( handle: SavedStateHandle ) : ViewModel() {
val counter: MutableLiveData<Int> = handle.getLiveData("counter") } class MainActivity : AppCompatActivity() { private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) } private val viewModel by viewModels<MainViewModel> { SavedStateVMFactory(this, bundleOf("counter” to 0)) } } -
• ই ߓ Ҋ.. • ࢜۽ दೞח ۽ં or ѐੋ/ࣗӏݽ
ઑীח ݫܻо ѷਵա.. • ӝઓ ҳഅਸ ыҊ ח ҃, AAC ViewModel۽ ѹఋঠೡ ഛҊೠ ݫܻח ই হח ٠ Implication -
• 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 -
• On-demand Initialization (2.1.0) • App ېझী ജ҃ ࢸ ҙ۲
ղਊਸ ҳഅ • ੋझఢझ ஂٙ दী contextܳ ֈѹ.. ਃೡ ٸী ੋझఢझо ࢤࢿ ؽ • Google Play Service৬ ా (ழ߁.. २ & optional) - ҳഋ ױ݈ীࢲ ࢿמ ೱ࢚ • ഐജࢿ ѐࢶ (ongoing) • ӝӝী ٮܲ ز ର: ࢎਊо জਸ ઙܐೞݶ.. • Pixel → ۽ࣁझ ઙܐ. যڃ ױ݈ٜ → force stop (job ࢎۄઉߡܿ-0-; FCMب..;;;) Work Manager -
• Test Support • Robolectric Support (Available now!) • Unit
Test Support in alpha (2.1.0): TestWorkerBuilder, TestListenableWorkerBuilder • Foreground Support! • Job Scheduler۽ 10࠙ ܻ স۽٘ө ೡ ࣻ ݅, ӒѪࠁ ӡݶ? • োղ द Work Manager -
• Coroutine ਗ: Cancelableೠ ٘ ࢤࢿ оמ • Transactionب naturalೞѱ
ҳഅ оמ • Full-text Search • SQLite ഛӝמ Room 2.1 -
• RxJava ਗ! • Ӕؘ Flowable غחח ࠛݺഛ • View
ࢤࢿ оמ Room 2.1 -
• ӒܻҊ ખ ؊ ٍীח.. • Incremental Annotation Processing ਗ
• Many-to-many Relation ਗ • ݃Ӓۨ࣌ਸ ࠁ औѱ.. • Coroutines Channel/Flow ਗ Room -
• Before • RecyclerViewী ܻझܳ lazy load ೧ח ۄ࠳۞ܻ, but..
• Room, Realm, Retrofit ਗ • Soon in EAP, alpha this summer • Built in network ਗ with ী۞ ೩ٜ݂ • ؊ / footer ਗ • RxJava / Coroutines ా ъച! Paging -
• 3/19 1.0, 2.0 द • 2.1 • ViewModels scoped
to Navigation Graphs • Navigation by URI • Dialog • Future • Dynamic Delivery ਗ Navigation -
• ☀ • 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)