pab*_*sco 8 android illegalstateexception android-4.0-ice-cream-sandwich
ListActivity在使用用户选择的项目内容打开新活动后返回原始文件时,我收到此异常.它只发生在冰淇淋三明治上.
这是跟踪:
java.lang.IllegalArgumentException: The observer is null.
at android.database.Observable.unregisterObserver(Observable.java:59)
at android.widget.BaseAdapter.unregisterDataSetObserver(BaseAdapter.java:42)
at android.widget.AbsListView.onDetachedFromWindow(AbsListView.java:2373)
at android.view.View.dispatchDetachedFromWindow(View.java:9756)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2274)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2272)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2272)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2272)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2272)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2272)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2272)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2272)
at android.view.ViewRootImpl.dispatchDetachedFromWindow(ViewRootImpl.java:2227)
at android.view.ViewRootImpl.doDie(ViewRootImpl.java:3679)
at android.view.ViewRootImpl.die(ViewRootImpl.java:3667)
at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:320)
at android.view.WindowManagerImpl$CompatModeWrapper.removeViewImmediate(WindowManagerImpl.java:139)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3144)
at android.app.ActivityThread.access$1200(ActivityThread.java:122)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1179)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4340)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
堆栈中没有提到我的代码所以它真的令我困惑,我不能做一个脏的捕获事件:/
我DataSetObserver只在创建活动时注册匿名.此外,活动嵌入在ActivityGroup中(在4.0中已弃用,但仍应支持它,我希望如此).
新操作系统有没有人遇到过这个问题?
提前致谢.
更新:
好吧,我想我找到了问题的根源,虽然不知道如何解决它.
里面AbsListView.onDetachedFromWindow()我们有这个:
if (mAdapter != null) { // Android code added on ICS
mAdapter.unregisterDataSetObserver(mDataSetObserver);
mDataSetObserver = null;
}
Run Code Online (Sandbox Code Playgroud)
一旦观察者未注册,它就会被取消.问题是,出于某种原因,在ICS中它会被调用两次.我认为在删除操作中检查null参数有点愚蠢,就像在Observable类中一样:
public void unregisterObserver(T observer) { // Android code
if (observer == null) {
throw new IllegalArgumentException("The observer is null.");
}
synchronized(mObservers) {
int index = mObservers.indexOf(observer);
if (index == -1) {
throw new IllegalStateException("Observer " + observer + " was not registered.");
}
mObservers.remove(index);
}
}
Run Code Online (Sandbox Code Playgroud)
他们为什么不忽略它呢?他们可以做到这一点并且也可以工作(或者更好):
public void unregisterObserver(T observer) { // Android code
synchronized(mObservers) {
mObservers.remove(observer);
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*etz 11
这个问题是在Android 4.0.3中引入的,当观察者被多次释放时,Observable类被更改为抛出异常.它已被报告为一个错误,可以在这里阅读:http://code.google.com/p/android/issues/detail?id = 22496.
解决此问题的最简单方法是包装底层适配器并避免多个版本.
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
if (observer != null) {
super.unregisterDataSetObserver(observer);
}
}
Run Code Online (Sandbox Code Playgroud)
但这并不适用于所有情况,例如ExpandableListView有一个无法访问的内部适配器.这里的另一种解决方案是包装ExpandableListView并捕获异常.这个解决方案对我有用,我还没有发现任何副作用.
public class PatchedExpandableListView extends ExpandableListView {
public PatchedExpandableListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDetachedFromWindow() {
try {
super.onDetachedFromWindow();
} catch(IllegalArgumentException iae) {
// Workaround for http://code.google.com/p/android/issues/detail?id=22751
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7842 次 |
| 最近记录: |