【问题标题】:TextView.setText() with very long string blocks UI thread带有很长字符串的 TextView.setText() 会阻塞 UI 线程
【发布时间】:2013-06-25 02:28:53
【问题描述】:

TextView 设置文本需要多长时间是否有解决方法?我正在尝试设置一个很长的字符串,因此它最终会阻塞 UI 线程 2-3 秒。由于我无法从其他线程访问 TextView,我完全被难住了。

编辑: 目前,我在 AsyncTask doInBackground() 中构建字符串,并且 在 onPostExecute(在 uiThread 上运行)中调用 TextView.setText() TextView 放置在 ScrollView 中

【问题讨论】:

    标签: android textview


    【解决方案1】:

    即使是几个屏幕的信息,您也不应该有任何问题。如果字符串超长,可以考虑分块延迟加载内容。

    【讨论】:

    • 是否需要使用 ListView,每行都是单独的 TextView?
    • 不,将字符串按大小相等的部分分成一个数组。然后,您只需跟踪 textview 中的滚动位置:当它接近底部时,您使用 append() 将更多文本加载到视图中。所以 textview.append(array.get(position));.
    • 有趣的是有道理,那么我必须制作自己的自定义文本视图吗?
    • 没有。您可以阅读附加方法here 并使用您选择的数组。我会选择ArrayList。然后只需编写连接逻辑,这实际上只是存储位置变量并在每次新加载时递增它。
    • 我理解 append 方法和存储到数组中的整个想法。不过,我究竟会将存储位置并附加到 TextView 的逻辑放在哪里?
    【解决方案2】:

    由于我无法从其他线程访问 TextView,

    您可以使用不同的Thread,但仍然可以访问您的TextView。在不了解您的代码的情况下很难举出一个很好的例子,但您可以使用 runOnUiThread

    您可以使用AsyncTask。这样做,你可以在doInBackground()中做任何你需要的事情,并在onPostExecute()中设置文本

    虽然,我不确定您的字符串需要几秒钟才能加载多长时间。如果您正在做很多工作来将字符串放在一起,那么我建议您使用AsyncTask

    【讨论】:

    • 我目前已经在使用 AsyncTask。我在 onPostExecute() 中做的唯一一件事就是在 TextView 中设置文本,它阻塞了线程。因此,如果我无论如何尝试 runOnUiThread 基本上它会得到相同的结果
    • 好的,这是您的 OP 中应该包含的信息,以便我们可以提供更好的帮助。也许可以在AsyncTask 中发布您的操作方式,以便我们帮助找到更好的方法
    • @codeMagic runOnUIThread 等于继续在 uiThread 上工作。因此,除非切换到 ui 线程,否则您无法从不同的线程访问 textview。
    • @Talha 你可以从后台Thread 访问它的getter,但你不能从后台更新View
    • @codeMagic 你说得对,我也想说这个。
    猜你喜欢
    • 2019-08-11
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多