我正在使用 Retrofit、LiveData、Room(Android AAC)。NetworkBoundResource是googlesimple提供的网络源码和房间结合的好帮手。
由于Retrofit 2.6.0引入了对暂停的内置支持,我尝试修改NetworkBoundResource使用暂停功能instaed,LiveDataCallAdapter但遇到了很多麻烦。
这是我的修改:
abstract class NetworkBondResource<ResultType, RequestType>
@MainThread constructor() {
private val result = MediatorLiveData<Resource<ResultType>>()
private val supervisorJob = SupervisorJob()
init {
result.value = Resource.loading(null)
}
fun asLiveData() = result as LiveData<Resource<ResultType>>
suspend fun load() {
withContext(Dispatchers.Main) {
val dbSource = loadFromDb()
result.addSource(dbSource) { data ->
result.removeSource(dbSource)
if (shouldFetch(data)) {
// ! HERE--------------
GlobalScope.launch(Dispatchers.IO) {
fetchFromNetwork(dbSource)
}
} else {
result.addSource(dbSource) { newData ->
setValue(Resource.success(newData))
}
}
}
} …Run Code Online (Sandbox Code Playgroud) 我关注了这篇android开发博客的文章,这里是他的源代码。
该演示效果很好,但通常我们更喜欢centerCrop在图像列表中使用比例类型,并fitCenter在详细模式下使用。当我修改代码来实现这一点时,transition 无法处理缩放类型的变化。当从细节片段返回时,动画以错误的比例类型开始。

我找到了ChangeImageTransform过渡。该文件说:
此转换在场景更改之前和之后捕获 ImageView 的矩阵,并在转换期间对其进行动画处理。
与 ChangeBounds 结合,ChangeImageTransform 允许更改大小、形状或ImageView.ScaleType 的 ImageViews平滑地为内容设置动画。
所以我改变了过渡集:
<transitionSet
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="375"
android:interpolator="@android:interpolator/fast_out_slow_in"
android:transitionOrdering="together">
<changeBounds/>
<changeImageTransform/>
</transitionSet>
Run Code Online (Sandbox Code Playgroud)
但是动画变得越来越难看:

如何在不同比例类型之间平滑转换?
我将 Moshi 与 Kotlin 结合使用。根据README,自定义 TypeAdapter 可能如下所示:
class CardAdapter {
@ToJson String toJson(Card card) {
return card.rank + card.suit.name().substring(0, 1);
}
@FromJson Card fromJson(String card) {
return //...
}
}
Run Code Online (Sandbox Code Playgroud)
它接收一个对象或字符串,然后转换为另一个。但我做了一个这样的适配器:
class ConfigAdapter{
@ToJson
fun toJson(writer: JsonWriter, value: WfBaseConfig?) {
val moshi = Moshi.Builder().build()
when (value) {
is BoolConfig -> moshi.adapter(BoolConfig::class.java).toJson(writer, value)
// Other types ...
else -> throw
IllegalArgumentException("Unknown wf config type: ${value::class.java.simpleName}")
}
}
@FromJson
fun fromJson(reader: JsonReader): BaseConfig? {
var type = ""
val copy …Run Code Online (Sandbox Code Playgroud) 我的目标是简单地替换子字符串,但非常频繁。该程序在Android中运行。
比如我有一个 string ={a} is a good {b}.和一个 map= {{a}=Bob, {b}=boy},结果应该是Bob is a good boy.我需要处理不同字符串的这种替换最多 400 次对等秒,因为 map 的值会实时更新。
但是我使用 trie 树和 Aho-Corasick 自动机来获得高性能,这是核心片段:
val builder: StringBuilder
private fun replace(str: String): String {
if (!getFail) {
getFail()
}
var p = 1
builder.setLength(0)
for (c in str) {
builder.append(c)
if (c.toInt() !in 0..126) {
continue // ignore non-ascii char
}
var k = trie[p][c.toInt()]
while (k > 1) {
// find a tag
if (end[k] …Run Code Online (Sandbox Code Playgroud)