- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 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/
我正在尝试在我的 recyclerview 方法上实现此方法 Changing background color of selected item in recyclerview 我正确地遵循了脚本,
我有一个列表,其中填充了自定义 ArrayAdapter。 我想每秒更新一个进度条,所以我尝试使用 notifyDataSetChanged() 来重新绘制列表,但它似乎不起作用。 最佳答案 您如何更
我正在改进我的应用程序稳定性和性能,但现在我遇到了来自 Android Studio 的警告。请考虑以下适配器类: private class CoinsAdapter(private val fra
我正在制作一个Android来做名为list track的列表应用程序,现在我仍在研究该应用程序的基础知识。无论如何,我为列表 View 创建了一个上下文菜单,该上下文菜单只有1个选项“删除”,它的意
我想从另一个线程调用adapter.notifyDataSetChanged()。我读到我应该使用 AsyncTask 并在执行后执行 adapter.notifyDataSetChanged() 。
我知道这个问题已被问过数千次,但由于某种原因我找不到适合我的情况的答案。 我拥有的是一个从 Web 服务获取数据并用信息填充列表的线程。然后我想按下一个按钮并调用同一线程来获取更多数据并将其添加到列表
friend , 我正在为 android ListView 使用以下自定义适配器我面临的问题是调用 notifydatasetchanged() 后位置错误; 我第一次将数据与列表位置绑定(bind
我在 windows 7 64bit 下使用 android 1.6当我从扩展 BaseAdapter 的适配器对象调用 notifyDataSetChanged() 时,我得到了运行时异常 我尝试使
我有一个类 Myadapter extends BaseAdapter.in Myadapter 我更改了 MyListView 数据然后调用 notifyDataSetChanged() 方法,比如
我一直在寻找年龄并尝试了几个月。我永远无法让我的观点(任何观点)无效。这里有什么问题,任何人都可以告诉我吗?谁能告诉我如何使用这些无效方法。提前致谢! if(resul
在我的 Activity 中,我有两个 ListView ,因此我使用了两个不同的适配器。我的要求是在两个列表项中我都有一个按钮。单击任何 ListView 中的按钮,两个 ListView 中的数据
我有一个用于我的 ListView 的适配器,然后我需要使用 SensorChange 方法中的 notifydatasetchanged 方法刷新它。你知道 SensorChange 方法被频繁快速
我正在使用 FragmentStatePagerAdapter 来实现 VerticalPageAdapter 的目的,我必须为与 Button< 相关的相同 Fragment 创建动态编号 被按下,
这个问题在这里已经有了答案: Custom Adapter getView() method is not called (6 个答案) 关闭 7 年前。 这是我的代码我想在 ListView 中显
我正在尝试做的事情: 按下添加按钮时,将值从 EditText 插入到数据库。 用数据库中的数据填充 ListView 。 问题: 当我单击添加按钮时,它会将值插入到数据库中,但不会将其填充到 Lis
我正在尝试制作一个像 tinder 一样刷卡的应用程序。我有一个 Texview 上面有一些文字,当我刷下一张卡片时有另一个文字等等。我还想做的是当我单击一个按钮以删除屏幕上的卡片并转到下一张时。我正
我正在制作一个程序,该程序将寻找与手机蓝牙设备配对的程序,显示它们及其地址以供用户查看,并且当用户已经在他的手机中打开 Bt 时它工作正常。当他不这样做时会出现问题,导致添加到 arrayList 中
有人可以向我解释以下问题的来源: 我有一个列表,根据某些偏好显示多个项目。用户可以通过 SlidingDrawer 更改这些首选项。每当发生这种情况时,我都会获得与新首选项相对应的项目,然后使用以下代
我有一个 ListView ,它使用不同类中的基本适配器显示来 self 的数据库的多个数据。每次我删除或添加一个项目到我的数据库时,我都想刷新我的 ListView 。 这是我的代码,但它没有刷新我
在我的代码中,我有两个 Activity 。 一个是 ListView Activity ,另一个 Activity 用于修改数据。修改数据后,用户将返回到 ListView Activity 。 我
我是一名优秀的程序员,十分优秀!