Note that there are some explanatory texts on larger screens.

plurals
  1. POWhat is triggering this Exception instance: "java.lang.IllegalArgumentException: The observer is null." and how could it be avoid?
    primarykey
    data
    text
    <p>I'm getting this exception when returning to the original <code>ListActivity</code> after opening an new activity with the content of the item selected by the user. It only occurs on Ice Cream Sandwich.</p> <p>This is the trace:</p> <pre><code> 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) </code></pre> <p>None of my code is mentioned in the stack so it's really puzzling me and I can't event do a dirty catch :/</p> <p>I am registering an anonymous <code>DataSetObserver</code> only when the activity is created. Also the activity is embedded inside an ActivityGroup (which is deprecated in 4.0 but should still suport it, I was hoping).</p> <p>Has anybody had this problem with the new OS?</p> <p>Thanks in advance.</p> <hr> <p><strong>Update:</strong></p> <p>Ok, think I found the source of the problem although not sure how to resolve it. </p> <p>Inside <code>AbsListView.onDetachedFromWindow()</code> We have this:</p> <pre><code>if (mAdapter != null) { // Android code added on ICS mAdapter.unregisterDataSetObserver(mDataSetObserver); mDataSetObserver = null; } </code></pre> <p>Which, once the observer is unregistered, it gets nullified. The problem comes that, for some reason, in ICS it gets called twice. I think it's a bit silly to check for null parameters inside a <em>delete operation</em> as they do in the <code>Observable</code> class:</p> <pre><code>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); } } </code></pre> <p>Why don't they just ignore it ¬¬ They could just do this and would work as well (or better):</p> <pre><code>public void unregisterObserver(T observer) { // Android code synchronized(mObservers) { mObservers.remove(observer); } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload