【问题标题】:ViewHolder and AsyncTaskViewHolder 和 AsyncTask
【发布时间】:2015-12-29 04:40:15
【问题描述】:

我在使用 AsyncTask 更新 ListView 时遇到问题。

我使用 ViewHolders 来提高性能,但它们会导致 AsyncTask 出现问题。正如官方 android 网站所说,将 viewholder 传递给 asynctask 并不是一个坏主意(http://developer.android.com/training/improving-layouts/smooth-scrolling.html),但在这种情况下,当 AsyncTask 持续足够长的时间时,它会一次更新两个具有相同值的项目。

我有一个印象,即某个 viewholder 再次使用了 4-5 个项目,并且当 asynctask 在再次传递之前没有完成工作时,会发生相同的 viewholder 错误。一段时间后,此视图再次更新并具有正确的值,但我并不满意。

我的思维方式对吗?如何预防?

【问题讨论】:

    标签: android android-listview android-asynctask


    【解决方案1】:

    如您所知,视图在 ListView 中被重用。

    所以你在每个getView() 中启动一个AysncTask,多个任务可能会运行以在同一个视图中加载数据。 如果任务需要一些时间才能完成,尤其是在滚动时和滚动后,可能会出现错误。

    如何解决?

    基本上,您必须确保每个视图只运行一个(最新的)任务。 这可以通过保存对视图中最后一个任务的某种引用来完成。 如果启动了一个新的Task,你必须检查这个引用并取消旧的Task。

    可以在here找到一个很好的描述。

    “处理并发”部分对您来说应该是最有趣的。

    【讨论】:

      【解决方案2】:

      这取决于您的系统是如何设置的。如果您在请求视图时启动 AsyncTask,是的,您的思维方式是正确的。否则,我不能告诉你。

      您可以在 ViewHolder 中添加一个布尔值,表示“锁定”。如果您启动 AsyncTask,请将其设置为 true,并在完成后让 AsyncTask 将其设置为 false。在启动 AsyncTask 之前,测试锁定的布尔值是否设置为 false。这样你就知道不要启动另一个 AsyncTask。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-10
        相关资源
        最近更新 更多