2011-09-03 29 views
10

Użytkownik jednej z moich aplikacji zgłosił ten błąd. Jestem zdezorientowany, co to znaczy, jak to naprawić. Po odrobinie googlowania ... nadal nie ma szczęścia. Ktoś to widział wcześniej lub wiedział, jak to naprawić?java.lang.IllegalArgumentException: Obserwator ma wartość zerową

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.HeaderViewListAdapter.unregisterDataSetObserver(HeaderViewListAdapter.java:256) 
at android.widget.AbsListView.onDetachedFromWindow(AbsListView.java:2309) 
at android.view.View.dispatchDetachedFromWindow(View.java:8197) 
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1968) 
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1966) 
at android.view.ViewGroup.removeViewInternal(ViewGroup.java:3257) 
at android.view.ViewGroup.removeViewInternal(ViewGroup.java:3237) 
at android.view.ViewGroup.removeView(ViewGroup.java:3185) 
at com.aheudev.a.slickdeals.adapters.DealPageAdapter.destroyItem(DealPageAdapter.java:174) 
at android.support.v4.view.ViewPager.populate(ViewPager.java:415) 
at android.support.v4.view.ViewPager.completeScroll(ViewPager.java:696) 
at android.support.v4.view.ViewPager.computeScroll(ViewPager.java:668) 
at android.view.ViewGroup.drawChild(ViewGroup.java:2434) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2189) 
at android.view.View.draw(View.java:9282) 
at android.view.ViewGroup.drawChild(ViewGroup.java:2584) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2189) 
at android.view.ViewGroup.drawChild(ViewGroup.java:2582) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2189) 
at android.view.ViewGroup.drawChild(ViewGroup.java:2582) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2189) 
at android.view.View.draw(View.java:9282) 
at android.widget.FrameLayout.draw(FrameLayout.java:419) 
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1923) 
at android.view.ViewRoot.draw(ViewRoot.java:1695) 
at android.view.ViewRoot.performTraversals(ViewRoot.java:1410) 
at android.view.ViewRoot.handleMessage(ViewRoot.java:2040) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:132) 
at android.app.ActivityThread.main(ActivityThread.java:4123) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:491) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
at dalvik.system.NativeStart.main(Native Method) 

I stało z tej funkcji w moim PagerAdapter:

@Override 
public void destroyItem(View collection, int position, Object view) { 
    ((ViewPager) collection).removeView((View) view); 
} 
+0

Znalazłem odpowiedź [tutaj]. (Http://stackoverflow.com/questions/8508294/what-is-trigger-this-exception-instance-java-lang-illegalargumentexception-th). – aheuermann

Odpowiedz

19

Ja też miałem ten sam problem i wygląda na to, że polecenie unregisterDataSetObserver na twoim DealPageAdapter jest wywoływane dwa razy. Aby rozwiązać ten problem I nadpisałeś się unregisterDataSetObserver w moim Adapter jako taki

@Override 
public void unregisterDataSetObserver(DataSetObserver observer) { 
    if (observer != null) { 
     super.unregisterDataSetObserver(observer); 
    } 
} 

nadzieję, że to pomaga!

+0

To jest to, czego potrzebowałem! –

+0

Dzięki temu działało .... po prostu dzięki człowieku. –

+0

pracował dla mnie, idealny !!!!! – TharakaNirmana

1

Istnieje kilka osób, które miały problem Here i Here

Od patrząc na stos wywołań to wygląda twój "widok" zarejestrował obserwatora, który teraz próbuje wyrejestrować. Ten obserwator już tam nie ma, nawet jeśli się tego oczekuje. Stąd błąd. Może to być błąd lub może być związany z tym, jak robisz różne rzeczy.

Próbujesz przejrzeć Android Source, aby sprawdzić, czy możesz go wyśledzić.

Powodzenia.

0

Alternatywnym rozwiązaniem jest zawinięcie ListView i wychwycenie wyjątku. To rozwiązanie sprawdziło się i nie znalazłem jeszcze żadnych skutków ubocznych.

 
    public class CustumListView extends ListView {

 public CustumListView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    } 

    @Override 
    protected void onDetachedFromWindow() { 
    try { 
     super.onDetachedFromWindow(); 
    } catch(IllegalArgumentException iae) { 

    } 
    } 
} 

Powiązane problemy