Android ListView布局过程的计时(如何在更改数据集时防止布局过程运行?)

Android ListView布局过程的计时(如何在更改数据集时防止布局过程运行?),android,android-layout,android-listview,Android,Android Layout,Android Listview,对的回答给我提出了一个不同的问题 显示ListView时,更新数据集,然后调用适配器的notifyDataSetChanged()。这将调用requestLayout(),Google文档说“这将安排视图树的布局过程” 所以很明显我们不知道什么时候会发生。但是在布局过程中,适配器中的许多自定义覆盖(如getView()和getCount())将访问数据集。因此,如果布局过程在未知时间运行,您如何知道何时更改数据集是安全的 我有一个包含多个数组的复杂数据集,需要彼此保持同步,因此我进行更改并调用n

对的回答给我提出了一个不同的问题

显示ListView时,更新数据集,然后调用适配器的notifyDataSetChanged()。这将调用requestLayout(),Google文档说“这将安排视图树的布局过程”

所以很明显我们不知道什么时候会发生。但是在布局过程中,适配器中的许多自定义覆盖(如getView()和getCount())将访问数据集。因此,如果布局过程在未知时间运行,您如何知道何时更改数据集是安全的

我有一个包含多个数组的复杂数据集,需要彼此保持同步,因此我进行更改并调用notifyDataSetChanged()。之后,我可能需要做更多的修改(比如,因为新的数据在网络中出现),那么我如何确保从以前的NoTIFYDATETETROUNDUDE()中获得的布局传递不会在进行新的更改的过程中运行?p> 此外,谷歌所说的“安排”布局通行证是什么意思?当我在getView()中记录内容时,Logcat屏幕中显示的TID与主UI线程相同。那么,在调用notifyDataSetChanged()之后,如果我检查新数据并开始更新数组,Android如何在同一线程中运行布局传递

因此,如果布局过程在未知时间运行,您如何知道何时运行 更改数据集是否安全

它非常简单:只需更新UI线程中的数据集,就可以保证避免任何问题。由于布局也发生在UI线程中,因此这两个操作都将按需要串行执行。这可以通过
AsyncTask
Handler
或任何其他线程通信方法实现

此外,谷歌所说的“安排”布局通行证是什么意思

将为UI线程的应用程序发布一条消息。只要线程空闲,它就会被处理

因此,如果布局过程在未知时间运行,您如何知道何时运行 更改数据集是否安全

它非常简单:只需更新UI线程中的数据集,就可以保证避免任何问题。由于布局也发生在UI线程中,因此这两个操作都将按需要串行执行。这可以通过
AsyncTask
Handler
或任何其他线程通信方法实现

此外,谷歌所说的“安排”布局通行证是什么意思

将为UI线程的应用程序发布一条消息。只要线程空闲,它就会被处理

因此,如果布局过程在未知时间运行,您如何知道何时运行 更改数据集是否安全

它非常简单:只需更新UI线程中的数据集,就可以保证避免任何问题。由于布局也发生在UI线程中,因此这两个操作都将按需要串行执行。这可以通过
AsyncTask
Handler
或任何其他线程通信方法实现

此外,谷歌所说的“安排”布局通行证是什么意思

将为UI线程的应用程序发布一条消息。只要线程空闲,它就会被处理

因此,如果布局过程在未知时间运行,您如何知道何时运行 更改数据集是否安全

它非常简单:只需更新UI线程中的数据集,就可以保证避免任何问题。由于布局也发生在UI线程中,因此这两个操作都将按需要串行执行。这可以通过
AsyncTask
Handler
或任何其他线程通信方法实现

此外,谷歌所说的“安排”布局通行证是什么意思


将为UI线程的应用程序发布一条消息。每当所述线程空闲时,将对其进行处理。

在什么确切条件下线程空闲?即使所有的东西都在同一个线程中运行,我也必须确保我不是在改变空闲状态下的数据集,或者在下一个空闲状态之前不改变数据集。或者至少改变数据集并调用notifyDataSetChanged()是原子WRT空闲状态。我不确定我是否理解这个问题。每当没有代码执行时,它都是空闲的。如果在UI线程中执行
a();b();c()
然后您可以确定
a()
b()
之间不会发生任何事情。在放弃控制之前,无法处理任何消息(甚至图形)。这就是为什么在UI线程中禁止或不鼓励某些操作(例如网络、文件i/o):UI将完全冻结,直到它们完成。因此操作系统的调度程序无法使线程空闲?调用系统例程如何,例如,如果您的示例中的“b();”是系统例程呢?我正在更新的数组和更新它们的代码都很复杂,我想确保如果空闲状态可能导致布局循环发生,它们将保持原子WRT到空闲状态。除非终止进程,否则不能中断UI线程。总而言之:(1)在后台进行复杂的计算,并生成一个结果,(2)通知UI线程用这个结果更新适配器(这不应该很复杂),并调用notifyDataSetChanged()。线程在什么样的确切条件下空闲?即使所有的东西都在同一个线程中运行,我也必须确保我不是在改变空闲状态下的数据集,或者在下一个空闲状态之前不改变数据集。或者至少改变数据集并调用notifyDataSetChanged()是原子WRT空闲状态。我不确定我是否理解这个问题。每当没有代码执行时,它都是空闲的。如果在UI线程中执行
a();b();c()
然后您可以确定
a()
b()
之间不会发生任何事情。在放弃控制之前,无法处理任何消息(甚至图形)。这就是为什么有些操作(例如网络)