IllegalStateException в PullToRefreshListView$InternalListViewSDK9

Я использую библиотеку PullToRefresh в двух действиях своего приложения. Я знаю, что эта библиотека устарела, но она очень полезна и может обрабатывать гены обновления не только сверху, но и снизу. Но у него есть проблема: приложение редко вылетает с таким логом:

java.lang.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. [in ListView(16908298, class com.handmark.pulltorefresh.library.PullToRefreshListView$InternalListViewSDK9) with Adapter(class android.widget.HeaderViewListAdapter)]
 at android.widget.ListView.layoutChildren(ListView.java:1551)
 at android.widget.AbsListView.onTouchEvent(AbsListView.java:4218)
 at android.view.View.dispatchTouchEvent(View.java:7461)
 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2264)
 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1995)
 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2270)
 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2010)
 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2270)
 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2010)
 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2270)
 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2010)
 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2270)
 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2010)
 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2270)
 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2010)
 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2270)
 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2010)
 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2270)
 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2010)
 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2270)
 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2010)
 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2270)
 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2010)
 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2270)
 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2010)
 at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2270)
 at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2010)
 at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2182)
 at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1512)
 at android.app.Activity.dispatchTouchEvent(Activity.java:2466)
 at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2130)
 at android.view.View.dispatchPointerEvent(View.java:7641)
 at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3682)
 at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3613)
 at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4804)
 at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4783)
 at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4875)
 at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
 at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
 at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:174)
 at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:4854)
 at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:4894)
 at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
 at android.view.Choreographer.doCallbacks(Choreographer.java:562)
 at android.view.Choreographer.doFrame(Choreographer.java:530)
 at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
 at android.os.Handler.handleCallback(Handler.java:725)
 at android.os.Handler.dispatchMessage(Handler.java:92)
 at android.os.Looper.loop(Looper.java:137)
 at android.app.ActivityThread.main(ActivityThread.java:5328)
 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:1102)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
 at dalvik.system.NativeStart.main(Native Method)

Этот сбой происходит так редко, что я вижу его на своем устройстве только один раз за месяцы частого использования. Но я вижу отчеты о сбоях с этим журналом от пользователей в консоли разработчика Google Play.

Насколько я понимаю, этот сбой происходит не в моем коде, а в коде библиотеки PullToRefresh в классе InternalListViewSDK9. Вот код InternalListViewSDK9:

@TargetApi(9)
final class InternalListViewSDK9 extends InternalListView {

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

    @Override
    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX,
            int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {

        final boolean returnValue = super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX,
                scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);

        // Does all of the hard work...
        OverscrollHelper.overScrollBy(PullToRefreshListView.this, deltaY, scrollY, isTouchEvent);

        return returnValue;
    }
}

Как исправить эту ошибку, учитывая, что я не могу ее воспроизвести? Может быть, его можно подавить?


person BArtWell    schedule 29.09.2013    source источник
comment
У меня тоже такая проблема, вы нашли решение?   -  person Carnal    schedule 01.10.2013
comment
Нет, решения пока не нашел...   -  person BArtWell    schedule 01.10.2013
comment
Я решил свою проблему, моя проблема была вызвана тем, что я слишком часто вызывал notifyDataSetChanged через короткие промежутки времени.   -  person Carnal    schedule 02.10.2013
comment
Спасибо за ответ! Но... Мое приложение представляет собой чат, и мне нужно часто вызывать notifyDataSetChanged().   -  person BArtWell    schedule 02.10.2013
comment
Да, но как часто вы ей звоните? Я также реализовал чат в своем приложении (хотя это было не то место, где он разбился). Но можете ли вы опубликовать код, в котором происходит этот сбой?   -  person Carnal    schedule 02.10.2013
comment
Слишком много кода нужно для понимания... И я не могу опубликовать его весь, извините. Но вы правы, в моем приложении это может быть вызвано два раза одновременно, когда сообщение приходит из двух разных источников (HTTP и сокет). Я буду предотвращать такое поведение. Спасибо за помощь!   -  person BArtWell    schedule 02.10.2013
comment
@BArtWell Возможно, вы захотите ответить на свой вопрос и принять его. Это поможет будущим зрителям, а также пометит этот вопрос как решенный. Спасибо   -  person Akshat Agarwal    schedule 20.11.2013
comment
Извини за поздний ответ. Да, я хочу подтвердить комментарий @Carnal. Я ограничиваю вызовы notifyDataSetChanged(), и это исключение больше не возникает.   -  person BArtWell    schedule 26.03.2014