解决Webview加载不完全导致部分js无效
問題出現
有兩種情況:
一種情況是打開activity時webview開始加載頁面,但是發現加載了一部分后就停止了,余下的一直不再加載。但是當關閉這個activity時發現webview又繼續加載了。
第二種情況是webview正常加載,但是進行操作時發現有些操作沒有反應。比如接入支付寶國際sdk,未裝支付寶app而使用h5頁面時出現點擊無反應的情況。
問題解析
進過反復測試發現,是因為有兩個含有webview的activity:activityA和activityB。在activityA的onPause和onResume中分別有mWebView.pauseTimers()和mWebView.resumeTimers(),但是activityB中沒有。先打開activityA加載web頁面,然后打開activityB,因為activityB沒有resumeTimers,他的部分js未成功加載,所以出現上面的現象。
問題根源
問題的根源就是WebView的pauseTimers()和resumeTimers()這兩個方法。它們的源碼及注釋如下
/*** Pauses all layout, parsing, and JavaScript timers for all WebViews. This* is a global requests, not restricted to just this WebView. This can be* useful if the application has been paused.*/ public void pauseTimers() {checkThread();mProvider.pauseTimers(); }/*** Resumes all layout, parsing, and JavaScript timers for all WebViews.* This will resume dispatching all timers.*/ public void resumeTimers() {checkThread();mProvider.resumeTimers(); }可以看到這兩個方法都是全局的,可以停止所有WebView的加載。所以當打開activityB的時候走了activityA的生命周期onPause,這樣執行了pauseTimers(),而因為是全局的所以作用到所有的webview,所以activityB的webview也被pause而停止了加載,同時因為activityB的生命周期中并沒有實現這兩個函數,所以在pauseTimers()后沒有執行resumeTimers(),所以activityB的web頁面被pause后也沒有恢復,這樣就導致了一部分js代碼沒有加載,這樣相關的效果就失效了。
解決方法
總結
以上是生活随笔為你收集整理的解决Webview加载不完全导致部分js无效的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 部署nodejs项目到服务器的一些总结
- 下一篇: 实现一个通用的中英文排序工具