Android WebView系列文章4 WebView的問題總結(jié)

WebView的問題總結(jié)
目錄介紹
1.關(guān)于加載H5頁面閃爍問題
2.WebView頁面中播放了音頻,退出Activity后音頻仍然在播放
3.為WebView自定義錯(cuò)誤顯示界面
4.判斷WebView是否已經(jīng)滾動(dòng)到頁面底端
5.在頁面中先顯示圖片

好消息

  • 博客筆記大匯總【16年3月到至今】忘闻,包括Java基礎(chǔ)及深入知識(shí)點(diǎn),Android技術(shù)博客也殖,Python學(xué)習(xí)筆記等等,還包括平時(shí)開發(fā)中遇到的bug匯總哗咆,當(dāng)然也在工作之余收集了大量的面試題膘掰,長(zhǎng)期更新維護(hù)并且修正吠昭,持續(xù)完善……開源的文件是markdown格式的!同時(shí)也開源了生活博客饺律,從12年起窃页,積累共計(jì)47篇[近20萬字],轉(zhuǎn)載請(qǐng)注明出處复濒,謝謝脖卖!
  • 鏈接地址:https://github.com/yangchong211/YCBlogs
  • 如果覺得好,可以star一下巧颈,謝謝畦木!當(dāng)然也歡迎提出建議,萬事起于忽微砸泛,量變引起質(zhì)變十籍!

1.關(guān)于加載H5頁面閃爍問題

  • 方案1:加載進(jìn)度條【該方法在夜間模式下無法解決閃爍問題】
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
    view.getSettings().setJavaScriptEnabled(true);
    if (progressDialog == null) {
        progressDialog=new ProgressDialog(PNewsContentActivity.this);
        progressDialog.setMessage("數(shù)據(jù)加載中蛆封,請(qǐng)稍后。勾栗。惨篱。");
        progressDialog.show();
        webView.setEnabled(false);// 當(dāng)加載網(wǎng)頁的時(shí)候?qū)⒕W(wǎng)頁進(jìn)行隱藏
    }
    super.onPageStarted(view, url, favicon);
}

@Override
public void onPageFinished(WebView view, String url) {
    view.getSettings().setJavaScriptEnabled(true);
    if (progressDialog != null && progressDialog.isShowing()) {
        progressDialog.dismiss();
        progressDialog = null;
        webView.setEnabled(true);
    }
    super.onPageFinished(view, url);
}

 @Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    view.loadUrl(url);           //在當(dāng)前的webview中跳轉(zhuǎn)到新的url
    return true;
}
  • 方案2:硬件加速器【夜間模式無效】
android webview 在3.0+后顯示flash和視頻要啟用硬件加速
開啟硬件加速是在manifest中加入: android:hardwareAccelerated="true"

開啟硬件加速后webview有可能會(huì)出現(xiàn)閃爍的問題
webView.setBackgroundColor(Color.parseColor("#000000")); //ok 不會(huì)閃黑屏
webView.setBackgroundColor(0x000000);          //會(huì)閃黑屏
由于webview的背景顏色默認(rèn)是白色,在一些場(chǎng)合下會(huì)顯得很突兀(比如背景是黑色【夜間模式】)围俘。
android:hardwareAccelerated="false"    清單文件
android:layerType="software"        布局文件
mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE,null); 代碼中
  • 方案3:設(shè)置延遲執(zhí)行夜間模式方法
1.布局
<WebView
    android:id="@+id/webview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"          
    android:visibility="visible"/>
//注意WebView默認(rèn)是白色背景砸讳,記得設(shè)置高度為包裹,否則夜間模式下無法用進(jìn)度條過渡閃頻
<ProgressBar
    android:id="@+id/progressBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:layout_marginTop="200dp"
    android:background="?containerBackground"
    android:visibility="gone"/>

2.代碼設(shè)置
private class DataWebViewClient extends WebViewClient {
    //H5頁面加載完成后執(zhí)行
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
  //執(zhí)行H5夜間模式點(diǎn)擊事件
        if (isNight) {
            wvDetailInvestor.loadUrl("javascript:toggleClassTest()");
        }
        if (handler == null) {
            handler = new Handler();
        }
  //延遲代碼執(zhí)行【避免刷屏】
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                wvDetailInvestor.setVisibility(View.VISIBLE);
                progressBar.setVisibility(View.GONE);          //進(jìn)度條隱藏
            }
        }, 500);
    }
    
    //H5頁面加載開始就執(zhí)行
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
        wvDetailInvestor.setVisibility(View.GONE);
        progressBar.setVisibility(View.VISIBLE);          //進(jìn)度條顯示
    }
}

2.WebView頁面中播放了音頻,退出Activity后音頻仍然在播放

    * 錯(cuò)誤:需要在Activity的onDestory()中調(diào)用webView.destroy(); 
    * 正確:webview調(diào)用destory時(shí),webview仍綁定在Activity上.這是由于自定義webview構(gòu)建時(shí)傳入了該Activity的context對(duì)象,因此需要先從父容器中移除webview,然后再銷毀webview:rootLayout.removeView(webView);

3.為WebView自定義錯(cuò)誤顯示界面
覆寫WebViewClient中的onReceivedError()方法:

/**
* 顯示自定義錯(cuò)誤提示頁面界牡,用一個(gè)View覆蓋在WebView
*/ 
protected void showErrorPage() { 
    LinearLayout webParentView = (LinearLayout)mWebView.getParent(); 
    initErrorPage(); 
    while (webParentView.getChildCount() > 1) {
        webParentView.removeViewAt(0); 
    }
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT); 
    webParentView.addView(mErrorView, 0, lp); 
    mIsErrorPage = true; 
} 
protected void hideErrorPage() { 
    LinearLayout webParentView = (LinearLayout)mWebView.getParent(); 
     
    mIsErrorPage = false; 
    while (webParentView.getChildCount() > 1) { 
        webParentView.removeViewAt(0); 
    } 
}   
protected void initErrorPage() { 
    if (mErrorView == null) { 
        mErrorView = View.inflate(this, R.layout.online_error, null); 
        Button button = (Button)mErrorView.findViewById(R.id.online_error_btn_retry); 
        button.setOnClickListener(new OnClickListener() { 
            public void onClick(View v) { 
                mWebView.reload(); 
            } 
        }); 
        mErrorView.setOnClickListener(null); 
    } 
} 
@Override 
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
     mErrorView.setVisibility(View.VISIBLE); 
     super.onReceivedError(view, errorCode, description, failingUrl); 
}

4.判斷WebView是否已經(jīng)滾動(dòng)到頁面底端
getScrollY()方法返回的是當(dāng)前可見區(qū)域的頂端距整個(gè)頁面頂端的距離,也就是當(dāng)前內(nèi)容滾動(dòng)的距離.
getHeight()或者getBottom()方法都返回當(dāng)前WebView 這個(gè)容器的高度
getContentHeight 返回的是整個(gè)html 的高度,但并不等同于當(dāng)前整個(gè)頁面的高度,因?yàn)閃ebView 有縮放功能, 所以當(dāng)前整個(gè)頁面的高度實(shí)際上應(yīng)該是原始html 的高度再乘上縮放比例. 因此,更正后的結(jié)果,準(zhǔn)確的判斷方法應(yīng)該是:

if(WebView.getContentHeight*WebView.getScale() == (webview.getHeight()+WebView.getScrollY())){
    //已經(jīng)處于底端
}

5.在頁面中先顯示圖片

@Override 
public void onLoadResource(WebView view, String url) { 
  mEventListener.onWebViewEvent(CustomWebView.this, OnWebViewEventListener.EVENT_ON_LOAD_RESOURCE, url); 
    if (url.indexOf(".jpg") > 0) { 
    hideProgress(); //請(qǐng)求圖片時(shí)即顯示頁面 
    mEventListener.onWebViewEvent(CustomWebView.this, OnWebViewEventListener.EVENT_ON_HIDE_PROGRESS, view.getUrl()); 
    } 
    super.onLoadResource(view, url); 
}

后續(xù):
平時(shí)喜歡寫寫文章簿寂,筆記。別人建議我把筆記宿亡,以前寫的東西整理常遂,然后寫成博客,所以我會(huì)陸續(xù)整理文章挽荠,只發(fā)自己寫的東西克胳,敬請(qǐng)期待:
知乎:https://www.zhihu.com/people/yang-chong-69-24/pins/posts
領(lǐng)英:https://www.linkedin.com/in/chong-yang-049216146/
簡(jiǎn)書:http://www.reibang.com/u/b7b2c6ed9284
csdn:http://my.csdn.net/m0_37700275
網(wǎng)易博客:http://yangchong211.blog.163.com/
新浪博客:http://blog.sina.com.cn/786041010yc
github:https://github.com/yangchong211
喜馬拉雅聽書:http://www.ximalaya.com/zhubo/71989305/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市坤按,隨后出現(xiàn)的幾起案子毯欣,更是在濱河造成了極大的恐慌馒过,老刑警劉巖臭脓,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異腹忽,居然都是意外死亡来累,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門窘奏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘹锁,“玉大人,你說我怎么就攤上這事着裹×旎” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵骇扇,是天一觀的道長(zhǎng)摔竿。 經(jīng)常有香客問我,道長(zhǎng)少孝,這世上最難降的妖魔是什么继低? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮稍走,結(jié)果婚禮上袁翁,老公的妹妹穿的比我還像新娘柴底。我一直安慰自己,他們只是感情好粱胜,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布柄驻。 她就那樣靜靜地躺著,像睡著了一般年柠。 火紅的嫁衣襯著肌膚如雪凿歼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天冗恨,我揣著相機(jī)與錄音答憔,去河邊找鬼。 笑死掀抹,一個(gè)胖子當(dāng)著我的面吹牛虐拓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播傲武,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蓉驹,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了揪利?” 一聲冷哼從身側(cè)響起态兴,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疟位,沒想到半個(gè)月后瞻润,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甜刻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年绍撞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片得院。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡傻铣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出祥绞,到底是詐尸還是另有隱情非洲,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布蜕径,位于F島的核電站两踏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏丧荐。R本人自食惡果不足惜缆瓣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望虹统。 院中可真熱鬧弓坞,春花似錦隧甚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至族吻,卻和暖如春帽借,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背超歌。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工砍艾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人巍举。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓脆荷,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親懊悯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜓谋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,265評(píng)論 25 707
  • github排名https://github.com/trending,github搜索:https://gith...
    小米君的demo閱讀 4,613評(píng)論 2 38
  • 起初,他也不知道這花有什么好看炭分,甚至有些懼怕桃焕,這開在荒野的花,詭魅的艷紅捧毛。 只是失足跌下陡坡观堂,他俯下身子來躲過那碎...
    阿弋z閱讀 239評(píng)論 0 2
  • 眾所周知,杜邦分析法現(xiàn)在已經(jīng)被眾多公司所熟知岖妄,且被運(yùn)用于實(shí)際工作之中型将。但是很多公司對(duì)于杜邦分析法的了解還是處于一種...
    你弟路過閱讀 327評(píng)論 0 1
  • 有多少清晨 是被鳥兒叫醒 揉揉朦朧的眼 太陽剛好爬到西墻 有多少云彩 化作一把傘 撐在不安的心頭 雨和雪便寫下不安...
    慕容蘭馨閱讀 292評(píng)論 2 5