Basado en los componentes de la arquitectura de Android, Kotlin coroutine + retrofit está integrado para simular la red para un desarrollo rápido de una manera integral.
Navegación
NavController administra los objetos de navegación de la aplicación en NavHost, navega a un objetivo específico a lo largo de una ruta específica en el mapa de navegación, o navega directamente a un objetivo específico.
Primero, defina layout / 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" />
En segundo lugar, defina navigation / mobile_navigation.xml
Para agregar Actividad, primero debe crear la Actividad correspondiente en el Proyecto, que puede procesarse en el diseñador de diseño.
<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>
Finalmente, la página salta, se pasa el parámetro
val direction = HomeFragmentDirections.actionNavigationHomeToDetailActivity(plantId)
view.findNavController().navigate(direction)
Parámetro de recepción:
private val args: DetailActivityArgs by navArgs()
El enlace de datos
El uso del control directamente en onCreateView () informará una excepción de puntero nulo. Este gesto vinculante.tvNavigation es posible.
val binding = FragmentHomeBinding.inflate(inflater, container, false)
binding.tvNavigation.setOnClickListener {
navigateToDetailPage("1", it)
}
En el archivo de diseño, concatenación de cadenas, como el uso con ViewModel:
android:text='@{"Data From Network-> "+viewModel.response}'
ViewModel
Almacene y administre datos relacionados con la interfaz de una manera de ciclo de vida
Kotlin coroutine viewModelScope, si ViewModel se borra, las rutinas iniciadas en este ámbito se cancelarán automáticamente.
private val homeViewModel: HomeViewModel by viewModels {
InjectorUtils.provideHomeViewModelFactory(requireContext())
}
viewModelScope.launch {
...
}
Datos en tiempo real
Una clase de almacenamiento de datos observable con conocimiento del ciclo de vida, lo que significa que sigue el ciclo de vida de otros componentes de la aplicación (como Actividad, Fragmento o Servicio).
var plantName = gardenPlantings.map {
...
}
El mapa implementa la conversión de LiveData
Habitación
Para crear un caché de datos de aplicaciones, SQLite proporciona una capa de abstracción basada en SQLite, haciendo un uso completo de las potentes funciones de SQLite y un mecanismo de acceso a la base de datos más robusto.
Al usar Room para hacer referencia a datos complejos, Room proporciona la capacidad de convertir entre tipos básicos y tipos de contenedor, pero no permite referencias de objetos entre entidades.
Para agregar dicho soporte para tipos personalizados, debe proporcionar un TypeConverter, que puede convertir de ida y vuelta entre la clase personalizada y los tipos conocidos que Room puede retener.
class Converters {//TypeConverters ...}
Agregue la anotación @TypeConverters a la clase AppDatabase para que Room pueda usar el convertidor que definió para cada entidad y DAO en la AppDatabase:
@Database(entities = table, version = 1, exportSchema = false)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
...
}
@Insert
suspend fun insertPlant(plant: Plant): Long
Piensa en la suspensión de la rutina
WorkManager
Con la API WorkManager, puede programar fácilmente tareas asincrónicas diferibles que deberían ejecutarse incluso cuando la aplicación se cierra o el dispositivo se reinicia.
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 se utiliza para trabajos repetitivos o repetitivos, el intervalo mínimo debe ser de 15 minutos.
OneTimeWorkRequest se aplica una vez y no repite el trabajo.
WorkManager se ejecuta secuencialmente, en modo singleton, y se ejecuta una vez cuando se inicia la aplicación.
Dirección de descarga del código Github:
https://github.com/AlbertShen0211/Android-architecture-components
Para comprender mejor el código, los dibujos son los siguientes