小编Sty*_*kis的帖子

如何在 Android Jetpack 数据存储中执行版本迁移

执行从 SharedPrefs 到 DataStore 的迁移非常简单并且有很好的文档记录。但是,当我想要从 DataStore 到静态 DataStore 进行简单的“版本碰撞”迁移时,这意味着某些键可能已更改等。应该如何执行此操作?

就我现在看来,我们需要在创建DataStore时在migrations参数中手动实现这些功能。

PreferenceDataStoreFactory.create(
    migrations = listOf(
        object : DataMigration<Preferences> {
            override suspend fun cleanUp() {
                TODO("Not yet implemented")
            }

            override suspend fun migrate(currentData: Preferences): Preferences {
                TODO("Not yet implemented")
            }

            override suspend fun shouldMigrate(currentData: Preferences): Boolean {
                TODO("Not yet implemented")
            }
        },
    ),
    produceFile = {
        get<Context>().preferencesDataStoreFile("filename")
    }
)
Run Code Online (Sandbox Code Playgroud)

我还没有看到有人谈论它,或者不幸的是它是 Codelab 的一部分,这对我来说是一个很大的惊喜。有人可以指出我可以在哪里寻找一些有关如何正确执行此操作的灵感吗?

android sharedpreferences android-jetpack android-jetpack-datastore

9
推荐指数
1
解决办法
1026
查看次数

Jetpack Compose 可以用于构建应用小部件吗?

使用 swift,可以使用 SwiftUI 编写小部件,但我没有看到任何关于是否可以使用 Jetpack Compose 构建 Android 应用小部件的声明。

现在 Compose 处于 Alpha 阶段,是否有任何信息可以让我看到如何做到这一点?

android android-widget android-jetpack-compose

8
推荐指数
4
解决办法
1239
查看次数

Android Room,如何保存一个实体,其中变量之一是密封类对象

我想在我的 Room 数据库中保存一个对象,其中一个变量可以是一种类型或另一种类型。我认为密封类是有意义的,所以我采取了这种方法:

sealed class BluetoothMessageType() {
    data class Dbm(
        val data: String
    ) : BluetoothMessageType()

    data class Pwm(
        val data: String
    ) : BluetoothMessageType()
}
Run Code Online (Sandbox Code Playgroud)

甚至是这样,但没有必要。我发现这个给了我更多的错误,因为它不知道如何处理 open val,所以如果我找到第一个版本的解决方案,无论如何我都会很高兴。

sealed class BluetoothMessageType(
    open val data: String
) {
    data class Dbm(
        override val data: String
    ) : BluetoothMessageType()

    data class Pwm(
        override val data: String
    ) : BluetoothMessageType()
}
Run Code Online (Sandbox Code Playgroud)

然后是实体类

@Entity(tableName = MESSAGES_TABLE_NAME)
data class DatabaseBluetoothMessage(
    @PrimaryKey(autoGenerate = true)
    val id: Long = 0L,
    val time: Long = Instant().millis,
    val …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-sqlite android-room sealed-class

7
推荐指数
1
解决办法
2822
查看次数

对 JVM 内存消耗进行基准测试,类似于 Android 操作系统的做法

当尝试对特定方法进行基准测试时,关于创建了多少对象以及在该方法运行时它们占用了多少字节,在 Android 中可以这样做:

Debug.resetThreadAllocCount()
Debug.resetThreadAllocSize()
Debug.startAllocCounting()
benchmarkMethod()
Debug.stopAllocCounting()
var memoryAllocCount = Debug.getThreadAllocCount()
var memoryAllocSize = Debug.getThreadAllocSize()
Run Code Online (Sandbox Code Playgroud)

我现在想对相同的方法进行基准测试,但在这些方法不可用的普通桌面应用程序上。我没有发现任何类似的东西,我尝试过的任何其他内存基准测试代码都没有提供一致的结果,就像上面的代码一样,每次运行相同的基准测试时都会给出完全相同的结果。

任何建议,最好只是代码将不胜感激,但是如果它能够执行我正在尝试做的任务,我也愿意尝试一些软件。

java memory benchmarking jvm memory-profiling

2
推荐指数
1
解决办法
185
查看次数