【发布时间】:2013-01-27 21:13:45
【问题描述】:
我有一个 FragmentPagerAdapter 用于显示大约 6 个选项卡,所有这些选项卡都从 Web 服务器加载它们的数据。其中一个选项卡包含一个从我的服务器加载图像的 WebView。 生成图像的服务器端成本很高,因此我想减少重新加载 WebView 的调用次数。 对于非 WebView 选项卡,我已经能够保存我的状态(对于那些,只是一个简单的数组)并在标签被刷过时恢复它们。
问题:
- 每次我使用 FragmentPagerAdapter 滑回 WebView 时都会重新加载,这会导致重新加载时间过长并且我的 Web 服务器上的负载很高。
考虑的解决方案:
- 使用ViewPager.setOffscreenPageLimit() 这是有问题的,因为它会强制加载更多选项卡,即使它们永远不会被查看。这在我的服务器上是不必要的昂贵。
- 使用WebView.saveState() 和WebView.restoreState() 文档已更新,以明确此处不再维护显示状态,因此这对这种情况不再有用。
- 将我的活动设置为:android:configChanges="keyboardHidden|orientation|screenSize" 这适用于旋转情况,但不会影响 ViewPager/FragmentPagerAdapter 在选项卡情况下滑动。
听起来WebView.saveState() 的旧行为会很完美...
【问题讨论】:
-
我首先要弄清楚片段中的什么触发了重新加载。
WebView本身对寻呼机和片段一无所知,因此某个地方的某个人正在对WebView执行某些操作以触发重新加载。然后,您可以努力抑制这种行为。 -
在 onCreateView 中,我有以下内容: wv = (WebView) view.findViewById(R.id.radarWebView); if(savedInstanceState != null) { wv.restoreState(savedInstanceState); } 其他 { wv.loadUrl(myURL); }
-
据我所知,主要是滑动会导致 Fragment 被破坏。当它回来时,它会尝试恢复状态,但由于 WebView 不再能够恢复显示状态,它必须重新加载(据我所知,这是最好的)。
-
“据我所知,主要是滑动导致 Fragment 被破坏”——不是
FragmentPagerAdapter。FragmentPagerAdapter是“PagerAdapter 的实现,它将每个页面表示为一个 Fragment,只要用户可以返回该页面,它就会永久保存在 Fragment 管理器中。” “在 onCreateView 中,我有以下内容”——您是否确定每次滑动时都会调用onCreateView(),即使对于以前查看过的页面也是如此? -
我知道一旦标签超过 setOffscreenPageLimit() 的限制,就会调用 onResume 和 onCreateView。
标签: android android-fragments android-webview