Hablemos de Android Jetpack

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

arquitectura.png

Publicado 488 artículos originales · elogiado 85 · 230,000 vistas +

Supongo que te gusta

Origin blog.csdn.net/Coo123_/article/details/105072377
Recomendado
Clasificación