Pull to refresh listview crash

1.4k Views Asked by At

I'm developing an android application which has a listview with two different view types

  • Application item.
  • Ad item (I'm using admob ad networks for these items).

The application works fine on 4.1+ android devices. but it crashes on 4.0.x devices.

The crash happens only in case of showing ads from the following networks:

  • MobFox
  • inMobi

I'm using chris banes pull to refresh (you can find it on):

I've tried many other adnetworks and it's working. Any Ideas?

java.lang.StackOverflowError
at android.view.ViewGroup.getChildVisibleRect(ViewGroup.java:4312)
at android.view.ViewGroup.getChildVisibleRect(ViewGroup.java:4316)
at android.view.ViewGroup.getChildVisibleRect(ViewGroup.java:4316)
at android.view.ViewGroup.getChildVisibleRect(ViewGroup.java:4316)
at android.view.ViewGroup.getChildVisibleRect(ViewGroup.java:4316)
at android.view.ViewGroup.getChildVisibleRect(ViewGroup.java:4316)
at android.view.ViewGroup.getChildVisibleRect(ViewGroup.java:4316)
at android.view.ViewGroup.getChildVisibleRect(ViewGroup.java:4316)
at android.view.ViewGroup.getChildVisibleRect(ViewGroup.java:4316)
at android.view.ViewGroup.getChildVisibleRect(ViewGroup.java:4316)
at android.view.View.getGlobalVisibleRect(View.java:8126)
at android.webkit.WebView.calcOurVisibleRect(WebView.java:2952)
at android.webkit.WebView.calcOurContentVisibleRectF(WebView.java:2975)
at android.webkit.WebView.drawCoreAndCursorRing(WebView.java:4655)
at android.webkit.WebView.drawContent(WebView.java:4215)
at android.webkit.WebView.onDraw(WebView.java:4298)
at android.view.View.draw(View.java:11082)
at com.adsdk.sdk.banner.BannerAdView$1.draw(BannerAdView.java:185)
at android.view.View.buildDrawingCache(View.java:10799)
at android.view.ViewGroup.drawChild(ViewGroup.java:2845)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at android.view.ViewGroup.drawChild(ViewGroup.java:2989)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at android.view.ViewGroup.drawChild(ViewGroup.java:2989)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at android.view.ViewGroup.drawChild(ViewGroup.java:2989)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at android.view.ViewGroup.drawChild(ViewGroup.java:2989)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at android.view.View.draw(View.java:11085)
at android.widget.FrameLayout.draw(FrameLayout.java:462)
at android.gesture.GestureOverlayView.draw(GestureOverlayView.java:393)
at android.view.ViewGroup.drawChild(ViewGroup.java:2991)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at android.view.ViewGroup.drawChild(ViewGroup.java:2989)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at android.view.ViewGroup.drawChild(ViewGroup.java:2989)
at android.widget.ListView.drawChild(ListView.java:3219)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at android.widget.AbsListView.dispatchDraw(AbsListView.java:2099)
at android.widget.ListView.dispatchDraw(ListView.java:3214)
at com.handmark.pulltorefresh.library.PullToRefreshListView$InternalListView.d
ispatchDraw(PullToRefreshListView.java:293)
at android.view.View.draw(View.java:11085)
at android.widget.AbsListView.draw(AbsListView.java:3419)
at android.view.ViewGroup.drawChild(ViewGroup.java:2991)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at android.view.ViewGroup.drawChild(ViewGroup.java:2989)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at android.view.View.draw(View.java:11085)
at android.view.ViewGroup.drawChild(ViewGroup.java:2991)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at android.view.ViewGroup.drawChild(ViewGroup.java:2989)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at android.view.ViewGroup.drawChild(ViewGroup.java:2989)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at android.view.ViewGroup.drawChild(ViewGroup.java:2989)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at android.view.View.draw(View.java:11085)
at android.support.v4.view.ViewPager.draw(ViewPager.java:2094)
at android.view.ViewGroup.drawChild(ViewGroup.java:2991)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at android.view.ViewGroup.drawChild(ViewGroup.java:2989)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at android.view.View.draw(View.java:11085)
at android.view.ViewGroup.drawChild(ViewGroup.java:2991)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at android.view.View.draw(View.java:11085)
at android.widget.FrameLayout.draw(FrameLayout.java:462)
at android.view.ViewGroup.drawChild(ViewGroup.java:2991)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at android.view.ViewGroup.drawChild(ViewGroup.java:2989)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at net.simonvt.menudrawer.BuildLayerFrameLayout.dispatchDraw(BuildLayerFrameLayout.java:77)
at android.view.View.draw(View.java:11085)
at android.widget.FrameLayout.draw(FrameLayout.java:462)
at android.view.ViewGroup.drawChild(ViewGroup.java:2991)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at net.simonvt.menudrawer.MenuDrawer.dispatchDraw(MenuDrawer.java:667)
at android.view.View.draw(View.java:11085)
at android.view.ViewGroup.drawChild(ViewGroup.java:2991)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at net.simonvt.menudrawer.BuildLayerFrameLayout.dispatchDraw(BuildLayerFrameLayout.java:77)
at android.view.View.draw(View.java:11085)
at android.widget.FrameLayout.draw(FrameLayout.java:462)
at android.view.ViewGroup.drawChild(ViewGroup.java:2991)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at net.simonvt.menudrawer.MenuDrawer.dispatchDraw(MenuDrawer.java:667)
at android.view.View.draw(View.java:11085)
at android.view.ViewGroup.drawChild(ViewGroup.java:2991)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593)
at android.view.View.draw(View.java:11085)
at android.widget.FrameLayout.draw(FrameLayout.java:462)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2145)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2026)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1634)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4441)
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)
3

There are 3 best solutions below

3
On

I strongly recommend that you move your AdView outside of your ListView and display it on it's own either above or below. A ListView does not easily lend itself to display different types of objects, and consequently is the cause of many issues just like the one you have described.

By moving it out of the ListView your ListView code will radically simplify.

0
On

I found that the problem has happened when the ad view tries to load the Ad from these sources. And it happened in the getChildVisibleRect() method in the Listview I solved this problem by hacking this method to force it to return false, to return empty visible rectangle, for android versions lower than jellybean.

I've tested it and it's working fine for me.I hope it helps.

4
On

I made the following changes in the Manifest file and it worked:

 android:largeHeap="true"

In the manifest file in the <application> tag