能否在CoroutinesTileService中使用Room数据库开发穿戴设备Tile?
在CoroutinesTileService中使用Room数据库的实现方案
1. 初始化Room实例
首先确保你的Room数据库实现单例模式,避免重复创建实例:
@Database(entities = [ActivityData::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun activityDao(): ActivityDao companion object { @Volatile private var INSTANCE: AppDatabase? = null fun getInstance(context: Context): AppDatabase { return INSTANCE ?: synchronized(this) { val instance = Room.databaseBuilder( context.applicationContext, AppDatabase::class.java, "activity_db" ).build() INSTANCE = instance instance } } } }
在CoroutinesTileService的onCreate方法中获取数据库和DAO实例:
class ActivityTileService : CoroutinesTileService() { private lateinit var activityDao: ActivityDao override fun onCreate() { super.onCreate() val db = AppDatabase.getInstance(applicationContext) activityDao = db.activityDao() } }
2. 在协程中执行Room数据操作
CoroutinesTileService的onTileRequest是挂起函数,直接调用DAO的挂起方法即可(需确保DAO方法用suspend修饰):
// DAO定义挂起查询方法 @Dao interface ActivityDao { @Query("SELECT * FROM activity_data WHERE date = :today") suspend fun getTodayActivity(today: String = LocalDate.now().toString()): ActivityData }
在Tile请求中获取数据并构建UI:
override suspend fun onTileRequest(requestParams: RequestParams): Tile { val todayData = activityDao.getTodayActivity() val progress = todayData.completedCount.toFloat() / todayData.dailyTarget.toFloat() return Tile.Builder() .setResourcesVersion("1") .setTimeline( Timeline.Builder() .addTimelineEntry( TimelineEntry.Builder() .setLayout( Layout.Builder() .setComposableContent { // 用Compose绘制进度UI Column( modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { CircularProgressIndicator( progress = progress, modifier = Modifier.size(48.dp) ) Spacer(modifier = Modifier.height(8.dp)) Text(text = "${(progress * 100).toInt()}%") } } .build() ) .build() ) .build() ) .build() }
3. 数据更新时主动刷新Tile
当Room中的活动数据变化时,需要触发Tile更新:
- 在数据修改的代码位置(如ViewModel、Repository)调用:
TileService.requestTileUpdate(context, ActivityTileService::class.java)
- 或在TileService中用Flow监听数据变化,自动刷新:
override fun onCreate() { super.onCreate() val db = AppDatabase.getInstance(applicationContext) activityDao = db.activityDao() lifecycleScope.launch { activityDao.observeTodayActivity().collect { requestTileUpdate() } } } // DAO添加Flow观察方法 @Query("SELECT * FROM activity_data WHERE date = :today") fun observeTodayActivity(today: String = LocalDate.now().toString()): Flow<ActivityData>
4. Tile中展示图表的优化建议
- 智能手表Tile空间有限,优先选择简化可视化组件:环形进度条、线性进度条,避免复杂柱状/折线图
- 提前在Repository或ViewModel中计算好进度值,Tile中只负责渲染,减少计算开销
- 用Compose的
Canvas自定义绘制极简图表时,控制绘制复杂度,保证Tile加载流畅
内容的提问来源于stack exchange,提问作者Neglected Sanity
相关产品推荐
相关产品推荐

