- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在产品中遇到无法重现的崩溃。跟踪没有说明崩溃的位置。进行一些搜索后,它看起来可能与 notifyDataSetChanged() 有关。它发生在 Android 6 和 7 上。
我有 2 个使用 listview 的包:
用于检查 wifi AP 列表的 BroadcastReceiver:在这种情况下,代码收集所有 AP,将它们添加到列表中并调用 notifyDataSetChanged:
@Override
public void onReceive(Context context, Intent intent) {
if (wifiManager != null) {
if (wifiManager.isWifiEnabled()) {
List<ScanResult> listeScan = wifiManager.getScanResults();
listeWifiItem.clear();
for (ScanResult scanResult : listeScan) {
WifiItem item = new WifiItem();
item.setAdresseMac(scanResult.BSSID);
item.setAPName(scanResult.SSID);
item.setForceSignal(scanResult.level);
listeWifiItem.add(item);
}
wifiAdapter.notifyDataSetChanged();
} else {
Toast.makeText(context, "You must activate the WiFi", Toast.LENGTH_SHORT);
}
}
}
还有一个异步任务,我在 onPostExecute 方法中调用了 notifyDataSetChanged:
@Override
protected void onPostExecute(Void result) {
iPadaptater.notifyDataSetChanged();
super.onPostExecute(result);
}
我使用 notifyDataSetChanged 的方式有问题吗?在异步任务中,如果用户移动到另一个函数,我认为这样做更安全
您认为崩溃与notifyDataSetChanged有关吗?
您是否从痕迹中看到了另一个重要信息?
这里有两种类型的痕迹:
-类型 1:
java.lang.IllegalStateException:
at android.widget.ListView.layoutChildren (ListView.java:1747)
at android.widget.AbsListView$CheckForTap.run (AbsListView.java:4728)
at android.os.Handler.handleCallback (Handler.java:751)
at android.os.Handler.dispatchMessage (Handler.java:95)
at android.os.Looper.loop (Looper.java:154)
at android.app.ActivityThread.main (ActivityThread.java:6776)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1410)
-类型 2:
java.lang.IllegalStateException:
at android.widget.ListView.layoutChildren (ListView.java:1623)
at android.widget.AbsListView.onTouchUp (AbsListView.java:4210)
at android.widget.AbsListView.onTouchEvent (AbsListView.java:3969)
at android.view.View.dispatchTouchEvent (View.java:9957)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:2705)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2386)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:2711)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2400)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:2711)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2400)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:2711)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2400)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:2711)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2400)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:2711)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2400)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:2711)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2400)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:2711)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2400)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:2711)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2400)
at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:2711)
at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2400)
at com.android.internal.policy.DecorView.superDispatchTouchEvent (DecorView.java:416)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent (PhoneWindow.java:1837)
at android.app.Activity.dispatchTouchEvent (Activity.java:3154)
at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent (WindowCallbackWrapper.java:63)
at com.android.internal.policy.DecorView.dispatchTouchEvent (DecorView.java:378)
at android.view.View.dispatchPointerEvent (View.java:10177)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent (ViewRootImpl.java:4634)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess (ViewRootImpl.java:4502)
at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:3953)
at android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:4006)
at android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:3972)
at android.view.ViewRootImpl$InputStage.apply (ViewRootImpl.java:3980)
at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:3953)
at android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:4006)
at android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:3972)
at android.view.ViewRootImpl$AsyncInputStage.forward (ViewRootImpl.java:4101)
at android.view.ViewRootImpl$InputStage.apply (ViewRootImpl.java:3980)
at android.view.ViewRootImpl$AsyncInputStage.apply (ViewRootImpl.java:4158)
at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:3953)
at android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:4006)
at android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:3972)
at android.view.ViewRootImpl$InputStage.apply (ViewRootImpl.java:3980)
at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:3953)
at android.view.ViewRootImpl.deliverInputEvent (ViewRootImpl.java:6443)
at android.view.ViewRootImpl.doProcessInputEvents (ViewRootImpl.java:6417)
at android.view.ViewRootImpl.enqueueInputEvent (ViewRootImpl.java:6378)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent (ViewRootImpl.java:6577)
at android.view.InputEventReceiver.dispatchInputEvent (InputEventReceiver.java:185)
at android.os.MessageQueue.nativePollOnce (Native Method)
at android.os.MessageQueue.next (MessageQueue.java:323)
at android.os.Looper.loop (Looper.java:136)
at android.app.ActivityThread.main (ActivityThread.java:6311)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:872)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:762)
最佳答案
查看API 25的源代码,唯一抛出非法状态异常的地方是ListView
的LayoutChildren()
。代码中的异常状态:
从 ListView$LayoutChildren
中提取:
// Handle the empty set by removing all views that are visible
// and calling it a day
if (mItemCount == 0) {
resetList();
invokeOnItemScrollListener();
return;
} else if (mItemCount != mAdapter.getCount()) {
throw new IllegalStateException("The content of the adapter has changed but "
+ "ListView did not receive a notification. Make sure the content of "
+ "your adapter is not modified from a background thread, but only from "
+ "the UI thread. Make sure your adapter calls notifyDataSetChanged() "
+ "when its content changes. [in ListView(" + getId() + ", " + getClass()
+ ") with Adapter(" + mAdapter.getClass() + ")]");
}
这表示 ListView
维护的内部项目计数与适配器维护的项目计数不匹配。看起来 LayoutChildren
可能是从 AbsListView
的 CheckforTap
内部类调用的:
从 AbsListView$CheckforTap
中提取:
if (!mDataChanged) {
final float[] point = mTmpPoint;
point[0] = x;
point[1] = y;
transformPointToViewLocal(point, child);
child.drawableHotspotChanged(point[0], point[1]);
child.setPressed(true);
setPressed(true);
layoutChildren();
// ... and it continues...
这可能就是其他人问您是否从非 UI 线程更改数据集的原因。它似乎也指出了您如何调用 notifyDataSetChanged()
的潜在问题。
假设您正在使用 UI 线程进行更改并且不知道更多关于您的应用程序的内部工作原理,我只能建议您不要将对 notifyDataSetChanged()
的调用与更改分开你正在做的。从您的回复来看,您似乎是这样做的。
关于android - 崩溃:android.widget.ListView.layoutChildren 中的 java.lang.IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46628967/
我目前在 Fabric 中遇到大量关于同一崩溃的许多不同实例的崩溃。即 FrameLayout.java 第 275 行 , FrameLayout.java 第 405 行 , FrameLayou
将标签添加到已添加到另一个 Pane 的 Pane 时,我遇到布局问题。 就像这个例子: public class MyClass extends Pane { private final Pan
我是一个非常新手的 android 开发者,需要一些帮助来解决一个奇怪的程序崩溃问题。通常程序会运行得很好。它有同样的机会失败(见最后的堆栈)。我可以看到程序通过 getView 函数运行,一切看起来
我正在尝试以完全编程的方式(不使用任何 xml)创建一个带有自定义列表项单元格的列表。我遇到了以下错误。在网上搜索了几个小时后,我将此作为我在 Stack Overflow 上的第一个问题。 感谢您对
我编辑了这张票。 我仍然在产品中看到那些崩溃。很少,但我想了解问题是什么。 我的跟踪中没有数据可以表明它在我的代码中崩溃的位置。 我应该根据堆栈跟踪在代码中查找什么? 我用谷歌搜索了术语 java.l
我在产品中遇到无法重现的崩溃。跟踪没有说明崩溃的位置。进行一些搜索后,它看起来可能与 notifyDataSetChanged() 有关。它发生在 Android 6 和 7 上。 我有 2 个使用
我是一名优秀的程序员,十分优秀!