【问题标题】:Pull to refresh listview crash拉动刷新listview崩溃
【发布时间】:2013-12-10 16:06:05
【问题描述】:

我正在开发一个具有两种不同视图类型的列表视图的 android 应用程序

  • 申请项目。
  • 广告项目(我正在为这些项目使用 admob 广告网络)。

该应用程序在 4.1+ android 设备上运行良好。但它在 4.0.x 设备上崩溃。

只有在展示来自以下网络的广告时才会发生崩溃:

  • MobFox
  • 在移动中

我正在使用 chris banes pull 来刷新(你可以在上面找到它):

我已经尝试了许多其他广告网络,而且效果很好。有什么想法吗?

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)

【问题讨论】:

  • 可能你的布局太复杂,或者是递归绘制。你的布局怎么样?你有很多嵌套的LinearLayout/RelativeLayout/FrameLayout吗?如果是这样,请尝试通过消除一些来扁平化您的布局,尤其是在您的列表视图单元格中。

标签: android listview admob pull-to-refresh


【解决方案1】:

我强烈建议您将 AdView 移到 ListView 之外,并将其单独显示在上方或下方。 ListView 不容易显示不同类型的对象,因此就像您所描述的那样,它会导致许多问题。

通过将其移出 ListView,您的 ListView 代码将大大简化。

【讨论】:

  • 我同意威廉的观点。除了他提到的原因之外,如果您将广告视图放在列表视图中,当用户滚动时,他将无法看到广告。因此,广告将投放到手机上,但毫无用处,您的点击率会下降。
  • 感谢您的帮助,但我在列表视图中添加了多个广告,这可能有助于提高点击率。
  • 如果您使用 Admob,则在同一屏幕上显示多个广告违反了他们的政策。我确信它适用于其他网络。这是锁定您的帐户的可靠方法。在任何情况下,它都不太可能增加您的点击率,只是增加用户的愤怒因素。
【解决方案2】:

我发现当广告视图尝试从这些来源加载广告时出现了问题。它发生在 Listview 的 getChildVisibleRect() 方法中 我通过破解这个方法来解决这个问题,强制它返回 false,返回空的可见矩形,对于低于 jellybean 的 android 版本。

我已经对其进行了测试,它对我来说运行良好。我希望它会有所帮助。

【讨论】:

    【解决方案3】:

    我在Manifest 文件中进行了以下更改,并且成功了:

     android:largeHeap="true"
    

    <application>标签的清单文件中

    【讨论】:

    • 你确定你把这个贴在了正确的地方吗?这似乎与您在自己的问题中发布的this answer 相同。
    • 没有理由甚至可以工作。崩溃与内存不足无关。 android:largeHeap 无论如何都是要避免的。
    • @botteaap 请参考java.lang.StackOverflowError 因为我的代码不是递归的,所以我只是增加了堆栈大小并且它起作用了,所以我认为它没有错。
    • @onkar 无论如何,你只是在对抗症状,而不是解决真正的问题。这对你有用很好,但不是解决这个问题的一般方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    相关资源
    最近更新 更多