博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Sunflower(向日葵)源码分析
阅读量:5090 次
发布时间:2019-06-13

本文共 3069 字,大约阅读时间需要 10 分钟。

简介:

Sunflower项目是google发布的kotlin项目,里面主要介绍google 最新的一些工具,使开发者可以快速构建自己的APP项目,具体源码:

在自己安装编译的时候,建议把包名(com.google.samples.apps.sunflower)改动下,因为com.google.xx安装后提示需要安装google的插件

一、主要技术

1、MVVM 利用databinding,viewModel,liveData实现MVVM架构,

2、利用navigation框架做导航,APP只有一个Activity,其余的都是Fragment

二、具体说明

1、界面实现

主Activity:GardenActivity 加载了一个布局

有个点没搞懂,既然没有数据,干嘛用<layout/>来封装,去掉这个layout的封装是没有问题的。

这里用到Navigation,我们来看看nav_garden

//使用navigation来包装,加载两个fragment app:startDestination设置主界面
//主fragment
//详情页
这个也不难,HomeViewPagerFragment主界面,PlantDetailFragment植物详情页,具体内容可以去了解下

   HomeViewPagerFragment 主要是一个viewPager,包含两个Fragment :GardenFragment和 PlantListFragment

class SunflowerPagerAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {    /**     * Mapping of the ViewPager page indexes to their respective Fragments     */    private val tabFragmentsCreators: Map
Fragment> = mapOf( MY_GARDEN_PAGE_INDEX to { GardenFragment() }, PLANT_LIST_PAGE_INDEX to { PlantListFragment() } ) override fun getItemCount() = tabFragmentsCreators.size override fun createFragment(position: Int): Fragment { return tabFragmentsCreators[position]?.invoke() ?: throw IndexOutOfBoundsException() }}

viewPager适配器SunflowerPagerAdapter中定义一个map,在创建Fragment的时候通过反射来执行构建Fragment的方法。

这里要注意viewPager和我们以前使用的viewPager并不是一个东西,而是在androidx.viewpager2.widget里面的新的类,主要通过RecyclerView来实现,适配器当然

也是继承RecyclerView.Adapter实现的,具体实现请查看源码,具体不细说。

GardenFragment和 PlantListFragment里面就比较简单,运用DataBinding来把数据绑定到View上,实现数据变化view改变,ViewModel来处理和管理数据,并进行数据通信。

这个里面涉及到的内容比较复杂,可以查看我另一个源码,比较简单的介绍DataBinding和ViewModel的用法,

2、数据加载

这个应用可以说是一个离线应用(数据离线,图片加载不是),主要的数据都是存储在plants.json,于是需要把内容都加载出来:

class SeedDatabaseWorker(    context: Context,    workerParams: WorkerParameters) : CoroutineWorker(context, workerParams) {    override suspend fun doWork(): Result = coroutineScope {        try {            applicationContext.assets.open(PLANT_DATA_FILENAME).use { inputStream ->                JsonReader(inputStream.reader()).use { jsonReader ->                    val plantType = object : TypeToken
>() {}.type val plantList: List
= Gson().fromJson(jsonReader, plantType) val database = AppDatabase.getInstance(applicationContext) database.plantDao().insertAll(plantList) Result.success() } } } catch (ex: Exception) { Log.e(TAG, "Error seeding database", ex) Result.failure() } }

主要在SeedDatabaseWorker类中,主要使用的是WorkManager这个框架来实现异步加载,加载后把数据存入room数据库,便于后续使用。

CoroutineWorker是Worker的子类,一般在使用Kotlin开发的时候使用来和协程配合开发,

看这部分代码可以先去学习下WorkManager,WorkManger介绍视频:(美丽的小姐姐不会让你失望的)

当然room数据库也有小哥哥的视频:

总结:

Sunflower这个应用主要的技术包括:DataBinding、ViewModel、LiveData、Navigation、WorkManager和Room,

当然还有一些简单的Android的知识和协程的内容,把这个应用过一遍,对自己也很有帮助。

 

转载于:https://www.cnblogs.com/doubleyoujs/p/11576227.html

你可能感兴趣的文章
MVC+Servlet+mysql+jsp读取数据库信息
查看>>
黑马程序员——2 注释
查看>>
用OGRE1.74搭建游戏框架(三)--加入人物控制和场景
查看>>
转化课-计算机基础及上网过程
查看>>
android dialog使用自定义布局 设置窗体大小位置
查看>>
ionic2+ 基础
查看>>
互联网模式下我们更加应该“专注”
查看>>
myeclipse集成jdk、tomcat8、maven、svn
查看>>
查询消除重复行
查看>>
Win 10 文件浏览器无法打开
查看>>
[leetcode]Minimum Path Sum
查看>>
内存管理 浅析 内存管理/内存优化技巧
查看>>
【BZOJ 5222】[Lydsy2017省队十连测]怪题
查看>>
Java跟Javac,package与import
查看>>
day-12 python实现简单线性回归和多元线性回归算法
查看>>
Json格式的字符串转换为正常显示的日期格式
查看>>
[转]使用 Razor 进行递归操作
查看>>
[转]Android xxx is not translated in yyy, zzz 的解决方法
查看>>
docker入门
查看>>
Android系统--输入系统(十一)Reader线程_简单处理
查看>>