小编Che*_*nhe的帖子

如何在 Retorfit 中使用具有暂停乐趣的 NetworkBoundResource

我正在使用 Retrofit、LiveData、Room(Android AAC)。NetworkBoundResourcegooglesimple提供的网络源码和房间结合的好帮手。

由于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 retrofit2 android-livedata kotlin-coroutines

8
推荐指数
1
解决办法
1290
查看次数

不同scaleType之间的Android共享元素转换

我关注了这篇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)

但是动画变得越来越难看:

如何在不同比例类型之间平滑转换?

android shared-element-transition

6
推荐指数
1
解决办法
363
查看次数

Moshi定制适配器参数

我将 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 kotlin moshi

5
推荐指数
0
解决办法
2415
查看次数

寻找一种 GC 友好的方式来频繁地替换子字符串

我的目标是简单地替换子字符串,但非常频繁。该程序在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)

string stringbuilder android garbage-collection kotlin

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