美文网首页Android开发经验谈Android技术知识Android开发
不可以错过的Android学习!带你看Android Jetpa

不可以错过的Android学习!带你看Android Jetpa

作者: 程序员的Vere | 来源:发表于2020-03-18 21:36 被阅读0次

    Android Jetpack 最佳开发姿势

    Android架构组件基础上,融入Kotlin协程+retrofit,模拟网络,全面快速开发。

    Navigation

    NavControllerNavHost 中管理应用导航的对象,沿导航图中的特定路径导航至特定目标,或直接导航至特定目标。

    首先,定义 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" />
    

    其次,定义navigation/mobile_navigation.xml Activity的添加,需要先在Project创建对应的Activity,即可在布局设计器处理。

      <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()
    

    Databinding

    onCreateView()中直接使用控件,会报空指针异常,这个姿势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

    一种可观察的数据存储器类,具有生命周期感知能力,意指它遵循其他应用组件(如ActivityFragmentService)的生命周期。

         var plantName = gardenPlantings.map {
              ...
          }
    

    map实现LiveData的转换

    Room

    创建应用数据的缓存, SQLite的基础上提供了一个抽象层,充分利用SQLite 的强大功能,更强健的数据库访问机制。

    使用Room 引用复杂数据,Room 提供了在基本类型和包装类型之间进行转换的功能,但不允许实体之间进行对象引用。

    要为自定义类型添加此类支持,您需要提供一个 TypeConverter,它可以在自定义类与 Room 可以保留的已知类型之间来回转换。

      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
    

    认为是协程suspend

    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按顺序执行,单例模式,app启动时执行一次。

    三、总结

    对于进阶这条路而言,学习是会有回报的!

    你把你的时间投资在学习上,就意味着你可以收获技能,更有机会增加收入。

    附上我的Android核心技术学习大纲,获取相关内容来我的GitHub一起玩耍:https://github.com/Meng997998/AndroidJX
    vx:xx1341452

    分享我的Android学习PDF大全来学习,这份Android学习PDF大全真的包含了方方面面了,内含Java基础知识点、Android基础、Android进阶延伸、算法合集等等

    我的这份学习合集,可以有效的帮助大家掌握知识点。

    总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习

    获取方式:关注我看个人介绍,或直接 点击我免费领取

    相关文章

      网友评论

        本文标题:不可以错过的Android学习!带你看Android Jetpa

        本文链接:https://www.haomeiwen.com/subject/mhqhyhtx.html