Androidアーキテクチャのコンポーネントに基づいて、Kotlinコルーチン+レトロフィットが統合され、ネットワークをシミュレートして、あらゆる面で迅速な開発を実現します。
ナビゲーション
NavControllerは、NavHostのアプリケーションナビゲーションのオブジェクトを管理するか、ナビゲーションマップの特定のパスに沿って特定のターゲットに移動するか、または特定のターゲットに直接移動します。
最初に、レイアウト/ activity_main.xmlを定義します
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:layout_constraintBottom_toTopOf="@id/nav_view"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/mobile_navigation" />
次に、navigation / mobile_navigation.xmlを定義します
アクティビティを追加するには、まず対応するアクティビティをProjectで作成する必要があります。これは、レイアウトデザイナーで処理できます。
<navigation
<fragment
android:id="@+id/navigation_home"
android:name="com.android.myapplication.ui.home.HomeFragment"
android:label="@string/title_home"
tools:layout="@layout/fragment_home">
<action
android:id="@+id/action_navigation_home_to_detail_activity"
app:destination="@id/detail_activity" />
</fragment>
...
<activity
android:id="@+id/detail_activity"
android:name="com.android.myapplication.ui.detail.DetailActivity"
android:label="DetailActivity">
<argument
android:name="detailId"
app:argType="string" />
</activity>
</navigation>
最後に、ページがジャンプし、パラメータが渡されます
val direction = HomeFragmentDirections.actionNavigationHomeToDetailActivity(plantId)
view.findNavController().navigate(direction)
パラメータ受信:
private val args: DetailActivityArgs by navArgs()
データバインディング
onCreateView()で直接コントロールを使用すると、nullポインタ例外が報告されます。このジェスチャbinding.tvNavigationは可能です。
val binding = FragmentHomeBinding.inflate(inflater, container, false)
binding.tvNavigation.setOnClickListener {
navigateToDetailPage("1", it)
}
レイアウトファイルでは、ViewModelでの使用などの文字列連結:
android:text='@{"Data From Network-> "+viewModel.response}'
ViewModel
インターフェースに関連するデータをライフサイクル方式で保存および管理します。
KotlinコルーチンviewModelScope。ViewModelがクリアされている場合、このスコープで開始されたコルーチンは自動的にキャンセルされます。
private val homeViewModel: HomeViewModel by viewModels {
InjectorUtils.provideHomeViewModelFactory(requireContext())
}
viewModelScope.launch {
...
}
LiveData
ライフサイクルを認識できる監視可能なデータストレージクラス。つまり、他のアプリケーションコンポーネント(アクティビティ、フラグメント、サービスなど)のライフサイクルに従います。
var plantName = gardenPlantings.map {
...
}
マップはLiveData変換を実装します
ルーム
アプリケーションデータのキャッシュを作成するために、SQLiteはSQLiteに基づく抽象化レイヤーを提供し、SQLiteの強力な機能とより堅牢なデータベースアクセスメカニズムを最大限に活用します。
Roomを使用して複雑なデータを参照すると、Roomは基本タイプとラッパータイプの間で変換する機能を提供しますが、エンティティ間のオブジェクト参照は許可しません。
このようなカスタムタイプのサポートを追加するには、カスタムクラスとRoomが保持できる既知のタイプとの間で相互に変換できるTypeConverterを提供する必要があります。
class Converters {//TypeConverters ...}
@TypeConvertersアノテーションをAppDatabaseクラスに追加して、Roomがエンティティごとに定義したコンバーターとAppDatabaseのDAOを使用できるようにします。
@Database(entities = table, version = 1, exportSchema = false)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
...
}
@Insert
suspend fun insertPlant(plant: Plant): Long
コルーチンのサスペンドを考える
WorkManager
WorkManager APIを使用すると、アプリケーションが終了したりデバイスが再起動したりした場合でも実行される、遅延可能な非同期タスクを簡単にスケジュールできます。
val workManagerConfiguration = Configuration.Builder()
.setWorkerFactory(RefreshDataWork.Factory())
.build()
WorkManager.initialize(appContext, workManagerConfiguration)
val constraints = Constraints.Builder()
.setRequiresCharging(true)
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
val work = PeriodicWorkRequestBuilder<RefreshDataWork>(2, TimeUnit.HOURS)
.setConstraints(constraints)
.build()
WorkManager.getInstance(appContext)
.enqueueUniquePeriodicWork(RefreshDataWork::class.java.name, KEEP, work)
PeriodicWorkRequestは反復作業または反復作業に使用されます。最小間隔は15分です。
OneTimeWorkRequestは一度だけ適用され、作業を繰り返すことはありません。
WorkManagerはシングルトンモードで順次実行され、アプリの起動時に1回実行されます。
コードGithubのダウンロードアドレス:
https://github.com/AlbertShen0211/Android-architecture-components
コードをよりよく理解するために、図面は次のようになっています