【发布时间】:2016-01-29 02:46:34
【问题描述】:
我发布了一个内置 Crashlytics 的应用程序来发送崩溃报告,这是我收到的报告:
“致命异常:java.lang.IllegalStateException:适配器的内容已更改但ListView没有收到通知。 确保适配器的内容不是从后台线程修改的,而只是从 UI 线程修改的。确保您的适配器在其内容更改时调用 notifyDataSetChanged()。 [在 ListView(2131493375, class android.widget.ListView) 和 Adapter(class com.nhatnq.app.b.cr)] 在 android.widget.ListView.layoutChildren(ListView.java) 在 android.widget.AbsListView.onLayout(AbsListView.java) ……”
我想知道是哪个 Apdater/ListView 发生了这个崩溃,所以我想从这些事情中追踪:
“com.nhatnq.app.b.cr”:包名被隐藏,我不知道。在我的应用程序中,我在包 com.nhatnq.app.contact.ExpandableContactAdapter.java 中有一个“ExpandableContactAdapter extends BaseExpandableListAdapter”,以及一些包含适配器的片段,例如 com.nhatnq.app.fragment.HistoryFragment$ExpandableHistoryAdapter, com.nhatnq.app.fragment.MessageFragment$ExpandableMessageAdapter,...
ListView(2131493375):这是 ListView 的 ID。我将它从 dec 转换为 hex,然后在我的本地源代码(在 R.java 中)中找到,但没有找到这个资源 ID。可能ID在发布时是按时间键编码的。
我需要在这里检查什么,找到正确的 ListView/Adapter 然后我可以检查?现在我有 5 个适配器,真的不知道需要检查什么,因为这个问题只发生在某些手机上。 我在一个团队中工作,其他人负责从团队源代码中发布应用程序。
【问题讨论】:
-
只需检查所有适配器并找出您要在后台线程中更新它的适配器。可能在 crashlytics 中您将获得所有详细信息,包括类名和行。
-
在崩溃报告中找不到任何行,这就是为什么我无法确切知道适配器出现问题的原因:(因为我有一个根视图 (SlidingMenu),当此视图 layoutChildren() 时,适配器之一崩溃,所以这里没有行代码。