一开始网上找方案,找到两种:
- 协程打印
suspend fun TextView.print1(text: String, finish:()->Unit) {
repeat(t.length) {
delay(30)
this@print1.text = t.take(it + 1)
}
}
这种方案,在增量文本更新的情况下,刷新 item,字体打印会疯狂的跳闪,把recyclerview的刷新动画屏蔽了,要不然一起闪。。。
- 使用 RxJava方案
var disposable: Disposable? = null
fun TextView.print2(text: String) {
try {
disposable = Flowable.interval(200, TimeUnit.MICROSECONDS)
.take(text.length.toLong())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
if (it == text.length.toLong() - 1) {
stop()
}
}
} catch (e: Exception) {
e.printStackTrace()
}
}
fun stop() {
if (disposable != null && !disposable!!.isDisposed) {
disposable!!.dispose()
}
}
这种方式,在增量文本更新的情况下,直接闪退,因为会创建多个 disposable
后面,我自己对这块想解决方案,我尝试着下面这种方式
var index = 0
suspend fun TextView.print2(text: String, finish:()->Unit) {
while (index < text.length) {
delay(30)
this.text = text.take(index + 1)
index += 1
}
if (text.endsWith("(end)")) {
LogUtils.d("======= 结束打印 。。。。。。")
index = 0
finish()
}
}
这种方案,在有几十个数据不断刷新 item 的情况下,不会出现跳闪、闪退的问题,打印也很流畅
被这个刷新数据,打印的效果折腾了好几天,算是解决了,记录一下