9週間のAndroidクリーンアップ(Repository Pattern,WorkManager)

5020 ワード

Repository Pattern



Androidシステムを開発する際、ローカルDBからデータをインポートしたり、ネットワークからデータを取得したりします.この場合、データにはさまざまな形式があります.Repositoryは、データとビジネスロジックの間に位置し、このような分離されたデータ形式をデータ形式に統合して提供するインタフェースである.

長所


(1)データロジックと業務ロジックを分けることができる


(2)ドメインは、一貫したインタフェースを介してデータを要求することができる。


(3)データストア内のデータをカプセル化することができる.オブジェクト向けのプログラミングに適しています。


(4)単位テストで検証できる.


(5)オブジェクト間の結合度が減少する.


(6)柔軟なアーキテクチャは,アプリケーション全体の設計が変化しても適用可能である.


WorkManager


WorkManagerは、継続的な作業のための推奨ソリューションです.WorkManagerはバックグラウンドタスクに使用されます.遅延と実行を保証する必要があります.

  • 遅延可能とは、すぐにタスクを実行する必要がないことを意味します.たとえば、分析データをサーバに送信したり、バックグラウンドでデータベースを同期したりすると、遅延する可能性があります.

  • 実行を保証することは、アプリケーションが停止したり、デバイスが再起動したりしても、操作が実行されることを意味します.
  • タスク・タイプ



    WorkManagerが処理する継続的なタスクは、次の3つです.

  • ≪即時|Immediate|emdw≫:すぐに開始し、すぐに完了する必要があるタスク.処理速度が速い.

  • Long Running:長時間(10分以上)の操作が可能です.

  • Deferrable:計画タスクは後で起動し、定期的に実行できます.
  • タイプの周期的アクセス方法でOneTimeWorkRequestとWorkerがタスクを即時に処理する場合は、OneTimeWorkRequestからsetExpedited()を呼び出します.Long Running 1回または周期的な作業要求またはWorker.WorkerはsetForeground()を呼び出して通知を処理します.1回のDeferrableまたは周期的なPeriodicWorkRequestとWorker

    WorkManagerライブラリのクラスの構成


  • Worker:クラスは、バックグラウンドで実行される実際の操作(タスク)を定義します.クラスを展開し、doWork()メソッドを再定義します.doWork()メソッドは、バックグラウンドでコードを実行する場所、例えばサーバとデータを同期したり、画像を処理したりする方法です.

  • WorkRequest:このような表示要求は、バックグラウンドでオペレータを実行する.WorkRequestを使用して、デバイス接続やWi-Fi接続などの制約条件の下でワークベンチタスクを実行する方法とタイミングを設定します.

  • WorkManager:このクラスはWorkRequestを保持して実行します.WorkManagerは、システムリソースの負荷を分散するために指定された制約条件を満たすとともに、作業要求を保持します.
  • WorkManagerの簡単な例


    Workerクラス
    class RefreshDataWorker(appContext: Context, params: WorkerParameters): CoroutineWorker(appContext, params) {
        companion object {
            const val WORK_NAME = "com.example.android.devbyteviewer.work.RefreshDataWorker"
        }
    
        override suspend fun doWork(): Result {
            val database = getDatabase(applicationContext)
            val repository = VideosRepository(database)
            try {
                repository.refreshVideos()
            } catch (err: HttpException) {
                return Result.retry()
            }
            return Result.success()
        }
    }
    WorkRequestとWorkManager
    /**
     * Override application to setup background work via WorkManager
     */
    class DevByteApplication : Application() {
        private val applicationScope = CoroutineScope(Dispatchers.Default)
    
        private fun delayedInit() {
            applicationScope.launch {
                Timber.plant(Timber.DebugTree())
                setupRecurringWork()
            }
        }
        /**
         * onCreate is called before the first screen is shown to the user.
         *
         * Use it to setup any background tasks, running expensive setup operations in a background
         * thread to avoid delaying app start.
         */
        override fun onCreate() {
            super.onCreate()
            delayedInit()
        }
    
        /**
         * Setup WorkManager background job to 'fetch' new network data daily.
         */
        private fun setupRecurringWork() {
            val constraint = Constraints.Builder()
                .setRequiredNetworkType(NetworkType.UNMETERED)
                .setRequiresBatteryNotLow(true)
                .setRequiresCharging(true)
                .apply {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        setRequiresDeviceIdle(true)
                    }
                }
                .build()
    
            val repeatingRequest = PeriodicWorkRequestBuilder<RefreshDataWorker>(1, TimeUnit.DAYS)
                .setConstraints(constraint)
                .build()
    
            WorkManager.getInstance().enqueueUniquePeriodicWork(
                RefreshDataWorker.WORK_NAME,
                ExistingPeriodicWorkPolicy.KEEP,
                repeatingRequest)
        }
    }
    

    ソース


    HERSTORY
    アンドロイド基礎コード実験室
    Android公式ドキュメント