Flow搜索优化

我们一般会监听文本变化,文本变化后就发起搜索请求。
但现在有两个问题

1. 毫无意义的中间搜索

比如用户快速输入123456789,我们希望只发起一次请求123456789,而不是发起9次请求(每次变化都发起请求),我们可以使用sample操作符

2.请求和响应顺序不一致导致显示的结果有误

比如我们先搜索123再搜索456,按照正常顺序123的搜索结果先返回,456的搜索结果后返回,页面最终显示456的搜索结果,没毛病。
但如果先返回456的搜索结果,再返回123的搜索结果,就会出现123的搜索结果覆盖456的搜索结果,结果就是错的。解决方法是mapLatest操作符。

代码如下


class MainActivity : AppCompatActivity() {


    private val _search = MutableStateFlow("")

    private lateinit var content: TextView

    private lateinit var editText: EditText

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        content = findViewById(R.id.content)
        editText = findViewById(R.id.search)



        lifecycleScope.launch {
            _search.sample(500)
                .filter {
                    it.isNotEmpty()
                }
                .mapLatest {
                    map(value = it)
                }.collect {
                    Log.d("TAG", "收到了结果 $it")
                    content.text = it
                }
        }

        editText.addTextChangedListener {
            _search.value = it.toString()
        }
    }

    private var current = 5

    private suspend fun map(value: String): String = withContext(Dispatchers.IO) {
        Log.d("TAG", "发起了请求 $value ,delay = $current")
        delay(current * 1000L)
        current -= 3
        if (current <= 0) {
            current = 5
        }
        value
    }

}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容