gpt4 book ai didi

Android - notifyDataSetChanged() 和线程

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:05:43 26 4
gpt4 key购买 nike

我有一个 AsyncTask,它在 doInBackground() 方法中进行一些数字运算(更多细节在接下来的几行中)。 doInBackground() 中操作的数据是与 ListView 的 适配器(在我的例子中是 SimpleAdapter)关联的数据。处理适配器数据后,我需要做的是调用 notifyDataSetChanged() 并更新我的 ListView。但是在 doInBackground() 中调用 notifyDataSetChanged() 会显示“不幸的是,‘应用名称’已停止工作”消息。我的错误堆栈显示:

06-22 08:01:49.083: E/AndroidRuntime(9955): FATAL EXCEPTION: AsyncTask #2 06-22 08:01:49.083: E/AndroidRuntime(9955): java.lang.RuntimeException: An error occured while executing doInBackground() 06-22 08:01:49.083: E/AndroidRuntime(9955): at android.os.AsyncTask$3.done(AsyncTask.java:299) 06-22 08:01:49.083: E/AndroidRuntime(9955): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 06-22 08:01:49.083: E/AndroidRuntime(9955): at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 06-22 08:01:49.083: E/AndroidRuntime(9955): at java.util.concurrent.FutureTask.run(FutureTask.java:239) 06-22 08:01:49.083: E/AndroidRuntime(9955): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 06-22 08:01:49.083: E/AndroidRuntime(9955): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 06-22 08:01:49.083: E/AndroidRuntime(9955): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 06-22 08:01:49.083: E/AndroidRuntime(9955): at java.lang.Thread.run(Thread.java:838) 06-22 08:01:49.083: E/AndroidRuntime(9955): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

最后一行

06-22 08:01:49.083: E/AndroidRuntime(9955): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

为我提供调试所需的信息。我通过从 onPostExecute() 调用 notifyDataSetChanged() 解决了这个问题,但我仍然不明白该方法实际上是如何工作的。我的问题是:

Q1。 notifyDataSetChanged() 实际上是如何更新 UI 的?

Q2。 notifyDataSetChanged() 和 UI 线程之间有什么联系?

Q3。有没有可以在工作线程上调用 notifyDataSetChanged() 的方法?

我是 Android 的初学者,对于这些基本问题的任何帮助将不胜感激。我的互联网搜索没有给我想要的答案。也非常感谢您的宝贵时间。

最佳答案

Q1. How does notifyDataSetChanged() actually update the UI ?

实际上,notifyDataSetChanged() 只会在其关联的观察者上触发 onChanged() 方法。对于 AdapterView 子类(例如 ListView),这最终会调用 requestLayout(),这 schedules a layout pass of the view tree .

这意味着 ListView 不会“立即”重新创建其 subview ,但一旦 UI 线程有空处理消息,它就会这样做。最终,将为每个项目调用 getView()

Q2. What is the connection between notifyDataSetChanged() and the UI thread ?

基本上,不允许从后台线程修改适配器的内容。 notifyDataSetChanged() 只是通知 AdapterView 它的数据已更改并且应该重绘的方法。

Q3. Is there any method in which notifyDataSetChanged() can be called on a worker thread ?

其实有好几种。您可以使用 Handler , AsyncTask.onPostExecute() , Activity.runOnUiThread()View.post() .

关于Android - notifyDataSetChanged() 和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24347840/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com