Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Android JetPack или что нового в 2018

Android JetPack или что нового в 2018

Геворк Сафарян, СберТех – MOSDROID #9 #Flourine – Видео https://youtu.be/4T3q5qXwhgY?t=21m47s

Поговорим о том какие новые компоненты были добавлены в Jetpack. Рассмотрим их в отдельности. Обсудим, что у них под капотом. И будет ли от них польза?

MOSDROID

June 23, 2018
Tweet

More Decks by MOSDROID

Other Decks in Programming

Transcript

  1. ANDROID JETPACK 2018 ЧТО НОВОГО В 2018? ▸ WorkManager ▸

    Navigation ▸ Paging ▸ Slices ▸ Android KTX 4
  2. ANDROID JETPACK 2018 WORKMANAGER 8 ПРИЛОЖЕНИЕ ЗАПУЩЕНО НЕТ ДА ИСПОЛЬЗОВАТЬ

    ПОТОКИ ЗАДАЧА ОТЛОЖЕННАЯ ДА НЕТ ВЕРСИЯ API? >=21 >=14 JOB SCHEDULER FIREBASE JOB DISPATCHER ALARMMANAGER ИСПОЛЬЗУЕТСЯ FIREBASE? ДА НЕТ
  3. ANDROID JETPACK 2018 WORKER 10 class SyncApiWorker : Worker() {

    override fun doWork(): WorkerResult { syncWithApi(); //return WorkerResult.FAILURE //return WorkerResult.RETRY return WorkerResult.SUCCESS } } EXAMPLE
  4. ANDROID JETPACK 2018 WORKREQUEST ▸ Класс запроса на добавление в

    очередь ▸ OneTimeWorkRequest [1] ▸ PeriodicWorkRequest [1…n] 11
  5. ANDROID JETPACK 2018 CONSTRAINTS 14 val myConstraints = Constraints.Builder() .setRequiresDeviceIdle(true)

    .setRequiresCharging(true) .setRequiresBatteryNotLow(false) .setRequiresStorageNotLow(false) .setRequiredNetworkType(NetworkType.CONNECTED) .build() val apiWorkerRequest = OneTimeWorkRequestBuilder<SyncApiWorker>() .setConstraints(myConstraints) .build()
  6. ANDROID JETPACK 2018 WORKSTATUS 15 AND WorkManager.getInstance().getStatusById(apiWorkerRequest.id) .observe( lifecycleOwner, Observer

    { workStatus -> if (workStatus != null && workStatus.state.isFinished) { // ... } } ) LIVEDATA
  7. ANDROID JETPACK 2018 WORKCONTINUATION 17 WORK A1 WORK A2 WORK

    B WORK D1 WORK D2 WORK E WORK C1 WORK C2 WORK C3 WORK F
  8. ANDROID JETPACK 2018 18 PERIODICWORKREQUEST EXAMPLE val chain1 = WorkManager.getInstance()

    .beginWith(workA1,workA2) .then(workB) .then(workC1,workC2,workC3) val chain2 = WorkManager.getInstance() .beginWith(workD1,workD2) .then(workE) val chain3 = WorkContinuation .combine(chain1, chain2) .then(workF) chain3.enqueue();
  9. ANDROID JETPACK 2018 PAGING 23 EXAMPLE class MyActivity: Activity{ val

    myViewModel: MyViewModel ... val adapter : PagedListAdapter ... fun init(){ myViewModel.users.observe(this){ adapter.submitList(this) } } }
  10. ANDROID JETPACK 2018 PAGING 24 EXAMPLE val config = PagedList.Config.Builder()

    .setPageSize(30) .setPrefetchDistance(10) .setInitialLoadSizeHint(50) .setEnablePlaceholders(false) .build() val data : LiveData<PagedList<ClipData.Item>> = LivePagedListBuilder(dataSourceFactory,config) .build()
  11. ANDROID JETPACK 2018 PAGING + RX 31 EXAMPLE val data

    : Observable<PagedList<ClipData.Item>> = RxPagedListBuilder(dataSourceFactory,config) .build()
  12. ANDROID JETPACK 2018 36 NAVIGATION EXAMPLE <navigation … app:startDestination="@+id/in_game"> <fragment

    android:id="@+id/in_game" android:name="com.example.android.navigationsample.InGame" …> <action android:id="@+id/action_in_game_to_resultsWinner" app:destination="@id/results_winner" app:enterAnim="@anim/fade_in" app:exitAnim="@anim/fade_out" app:popEnterAnim="@anim/slide_in_left" app:popExitAnim="@anim/slide_out_right" app:popUpTo="@+id/match" app:popUpToInclusive="false"/> </fragment> <fragment> … </fragment> </navigation>
  13. ANDROID JETPACK 2018 NAVIGATION ▸ Приложение должно иметь фиксированную начальную

    позицию ▸ Кнопка вверх никогда не выходит из приложения ▸ Вверх и назад эквивалентны 38 RULES
  14. ANDROID JETPACK 2018 42 SLICE EXAMPLE <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.app"> ...

    <application> ... <provider android:name="MySliceProvider" android:authorities="com.example.android.app" android:exported="true" > <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.app.slice.category.SLICE" /> </intent-filter> </provider> ... </application> </manifest>
  15. ANDROID JETPACK 2018 43 SLICE EXAMPLE class MySliceProvider : SliceProvider()

    { fun onCreateSliceProvider(): Boolean { return true } fun onBindSlice(sliceUri: Uri): Slice? { when (sliceUri.getPath()) { "/temperature" -> return createTemperatureSlice(sliceUri); } return null } }
  16. ANDROID JETPACK 2018 47 ANDROID view.viewTreeObserver.addOnPreDrawListener( object : ViewTreeObserver.OnPreDrawListener {

    override fun onPreDraw(): Boolean { viewTreeObserver.removeOnPreDrawListener(this) actionToBeTriggered() return true } }) view.doOnPreDraw { actionToBeTriggered() } ANDROID KTX