問題背景(都是帶WebView的頁面):
打開a頁面泞坦,關(guān)閉a頁面谤饭,打開b頁面,b頁面無法正常加載回調(diào) onload
問題查看
懷疑導(dǎo)致此問題的2個假設(shè)
1、html中的javascript代碼有問題
2讹俊、WebView 的 settings 設(shè)置有問題
問題排除1:
1、html中的javascript代碼有問題
在本地加了個本地html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="onloadTest" style="background: #000; color: #fff;"></div>
<script>
var imageUrl = "https://bkimg.cdn.bcebos.com/pic/b8389b504fc2d56206e31a90e31190ef77c66ce0?x-bce-process=image/resize,m_lfit,w_268,limit_1/format,f_jpg"
function createImage(src) {
var img = new Image();
img.onload = function () {
document.querySelector("#onloadTest").innerText = "onload 已調(diào)用";
};
img.src = src;
}
createImage(imageUrl)
</script>
</body>
</html>
問題排查:
1、打開a頁面茎活,在a頁面中進(jìn)行加載此html,a頁面正常加載回調(diào) onload
2琢唾、打開b頁面载荔,在b頁面中進(jìn)行加載此html,b頁面正常加載回調(diào) onload
3采桃、打開a頁面懒熙,關(guān)閉a頁面,打開b頁面普办,在b頁面中進(jìn)行加載此html工扎,b頁面無法正常加載回調(diào) onload
4、打開a頁面衔蹲,關(guān)閉a頁面肢娘,打開b頁面,在b頁面中進(jìn)行加載此html舆驶,b頁面無法正常加載回調(diào) onload橱健,關(guān)閉app(非后臺強(qiáng)制關(guān)閉app),打開b頁面沙廉,在b頁面中進(jìn)行加載此html拘荡,b頁面無法正常加載回調(diào) onload
5、打開a頁面撬陵,關(guān)閉a頁面珊皿,打開b頁面,在b頁面中進(jìn)行加載此html袱结,b頁面無法正常加載回調(diào) onload亮隙,后臺強(qiáng)制關(guān)閉app,打開b頁面垢夹,在b頁面中進(jìn)行加載此html溢吻,b頁面正常加載回調(diào) onload
小結(jié):
1、正常打開頁面能正常回調(diào)onload
2促王、打開a頁面后犀盟,只要沒有把app強(qiáng)制關(guān)閉,則打開b頁面一直不會回調(diào)onload
3蝇狼、所以確認(rèn)非html中的javascript代碼問題
問題排除2:
2阅畴、WebView 的 settings 設(shè)置有問題
final WebSettings webSettings = getSettings();
webSettings.setUserAgentString(QooUtils.getQooWebViewUserAgent(this));
webSettings.setAllowFileAccess(false);
webSettings.setBuiltInZoomControls(false);
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setSupportZoom(true);
webSettings.setDisplayZoomControls(false);
if (Build.VERSION.SDK_INT < 18) {
webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
}
webSettings.setDatabaseEnabled(true);
if (Build.VERSION.SDK_INT < 19) {
webSettings.setDatabasePath(databaseDir);
}
問題排查:
一個個設(shè)置去除,或全部去除迅耘,都還是同樣存在這個問題
小結(jié):
1贱枣、妹的,什么鬼颤专,都全干完了啊纽哥,還不對!F茱酢4核!
靈魂拷問:
經(jīng)過兩次驗證簇捍,兩個懷疑的對象都沒有問題只壳,難道是手機(jī)問題?暑塑?吼句??
于是找來了另兩部手機(jī)進(jìn)行測試梯投,問題同樣存在C健!分蓖! ***x*********x
再一次分析:
1尔艇、既然不是b頁面的問題,那就是a頁面的問題么鹤,找出a頁面與b頁面中的對webview 的使用有什么差異终娃??蒸甜?
一致的內(nèi)容:
1棠耕、初始化一致;
2柠新、settings 設(shè)置一致窍荧;
不一致的內(nèi)容:
1、a頁面調(diào)用了WebView的 onResume() 和 onPause() 方法恨憎;
嗯蕊退,肯定是這里面的不一樣導(dǎo)致的:
進(jìn)入到WebView的 onResume() 和 onPause() 方法查看郊楣,果然,這個WebView是自定義的瓤荔,在這兩個方法中增加?xùn)|西
@Override
public void onResume() {
if (Build.VERSION.SDK_INT >= 11) {
super.onResume();
}
resumeTimers();
}
@Override
public void onPause() {
pauseTimers();
if (Build.VERSION.SDK_INT >= 11) {
super.onPause();
}
}
resumeTimers() 和 pauseTimers() 是什么鬼净蚤??输硝?今瀑??
于是上網(wǎng)搜了一下点把,最終在下這個博客中找到了原因:
https://blog.csdn.net/liuwan1992/article/details/83658848
大概的意思如下:
問題:打開兩個 WebView 頁面橘荠,關(guān)閉其中一個頁面,另一個頁面中的部分操作不再響應(yīng)愉粤。
這個問題是由于 pauseTimers 導(dǎo)致的砾医,因為 pauseTimers 會暫停所有 WebView 的 layout、parsing 和 JavaScript timers衣厘,這是一個全局生效的方法,導(dǎo)致的結(jié)果是全局的 WebView 都被停止了 js 的調(diào)用压恒。
總結(jié):
1影暴、自己還是太水了
2、有些api不能亂用
3探赫、懷疑的對象不夠廣