Android Jetpack 最佳开发姿势
在Android架构组件基础上,融入Kotlin 协程+retrofit,模拟网络,全面快速开发。
Navigation
NavController在 NavHost 中管理应用导航的对象,沿导航图中的特定路径导航至特定目标,或直接导航至特定目标。
首先,定义 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
一种可观察的数据存储器类,具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。
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启动时执行一次。
代码Github的下载地址:
https://github.com/AlbertShen0211/Android-architecture-components
为了更好的理解代码,附图如下
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
03月10日云栖号头条:新公益“抗疫”,马云公益基金会打造互联网新样本
云栖号:https://yqh.aliyun.com第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策! 今日最新云头条快讯: 2月28日,马云公益基金会三届二次理事会视频全程对外公开。马云在会上说,“我想把马云公益基金会努力打造成公益模板,公益一定是公益的心态、商业的手法,用CEO的方法去运营公益。真正的公益,一要结果导向,二要效率导向,三要资源整合能力提升。”;根据网络流传的改版图,支付宝首页增设了几大生活服务板块,并将采取“千人千面”智能推荐机制,部分第三方服务会透出在首页。 一起来看最新的资讯: 新公益“抗疫”,马云公益基金会打造互联网新样本 在过去的短短一个多月时间里,来自马云公益基金会的医疗物资、生活物资、科研基金源源不断涌向湖北和其它疫区,还驰援到了日本、韩国、伊朗等海外疫情严重地区;1亿元科研基金支持了钟南山医学基金会等5家科研院所研发冠状病毒疫苗,以科学、专业、高效的方式带动社会资源共同“抗疫”,为抗击疫情发挥了重要作用,传递了正能量,成为互联网新公益的样本。 钟南山:估计全球疫情至少延续到6月份 钟南山院士表示,估计全...
- 下一篇
如何启用SAP Cloud Platform的mobile服务
在CloudFoundry环境的Service Market里找到Mobile Services,启用之后, 点击Support,进入mobile services的控制台: 我们要在Neo环境的WebIDE里控制CloudFoundry环境的mobile服务,因此需要创建Destination,指向CloudFoundry mobile services的admin url: Neo环境里创建一个Destination: 将mobile service控制台里的admin API url拷贝下来, 粘贴到Neo Destination的url字段里: 确保Check Connection连接成功。 本文来自云栖社区合作伙伴“汪子熙”,了解相关信息可以关注微信公众号"汪子熙"。
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS关闭SELinux安全模块
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长