前言
在之前的文章中裙戏,我曾經(jīng)給出了一種控制進(jìn)度條顯示和消失時(shí)機(jī)的方式乘凸。經(jīng)過(guò)實(shí)際的測(cè)試發(fā)現(xiàn),很多情況下然并卵挽懦。于是乎又有了本篇翰意,雖然還不夠完美,但是寫(xiě)出來(lái)給大家提供個(gè)思路信柿。
版權(quán)歸作者所有冀偶,如有轉(zhuǎn)發(fā),請(qǐng)注明文章出處:https://xiaodanchen.github.io/archives/
相關(guān)文章
Android在H5加載完成前顯示加載進(jìn)度條
Android 在H5加載完成前顯示加載進(jìn)度條2
實(shí)現(xiàn)方案:
其實(shí)在采用最終方案前渔嚷,作者還使用了另一種方案进鸠,本來(lái)不想寫(xiě)出來(lái),但是現(xiàn)在想想形病,那也是一種可以優(yōu)化的方向客年,所以還是說(shuō)一說(shuō)吧,暫且稱為方案1漠吻。
方案1:監(jiān)測(cè)WebView的繪制高度
監(jiān)聽(tīng)WebView的繪制高度量瓜,設(shè)定一個(gè)閾值,當(dāng)達(dá)到閾值后取消加載進(jìn)度條的顯示途乃。
//自定義WebView,重寫(xiě)OnDraw方法:示例代碼
public class WebpView extends WebView {
//自定義接口绍傲,用來(lái)回調(diào)控制進(jìn)度條的顯示和取消
public static interface ProgressListener{
void onShowLoading();
void onCancelLoading();
}
private ProgressListener mLinstner;
public void setProgressListener(ProgressListener listener){
mLinstner = listener;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//獲取當(dāng)前繪制的高度
curHelght = canvas.getHeight();
//如果當(dāng)前繪制的高度超過(guò)屏幕高度的70%,則取消進(jìn)度條顯示
if(curHelght>screenHeight*0.7){
if(null != mLinstner){
mLinstner.onCancelLoading();
}
}
}
}
方案1存在一個(gè)問(wèn)題:
如果我們需要加載的H5完整的高度本來(lái)就小于我們?cè)O(shè)定的閾值,進(jìn)度條取消的回調(diào)不會(huì)被觸發(fā)的耍共。
所以我進(jìn)一步思考烫饼,靈光乍現(xiàn),有了方案2试读。
方案1有個(gè)可以探索的方向:如果可以有辦法獲取H5 UI的高度杠纵,則可以根據(jù)H5的高度為基準(zhǔn)來(lái)控制顯示,但是可能H5的高度很難后者沒(méi)有方法獲取钩骇,所以這種思路不太具有普適價(jià)值比藻。
方案2:監(jiān)測(cè)WebView的繪制是否停止
以一定的時(shí)間跨度去檢測(cè)WebView是否仍在繪制,來(lái)判讀是否需要取消進(jìn)度條的顯示倘屹。
//如果發(fā)現(xiàn)500毫秒內(nèi)银亲,WebView沒(méi)有繪制,則取消進(jìn)度條顯示
public class WebpView extends WebView {
public WebpView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public WebpView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public WebpView(Context context) {
super(context);
}
private OnLoadFinishListener mOnLoadFinishListener;
private Handler mHandler;
private long lasttime;
private Runnable mdelay = new Runnable(){
public void run() {
if(System.currentTimeMillis() - lasttime >500){
if(mOnLoadFinishListener!= null){
mOnLoadFinishListener.onLoadFinish();
}
}
}
};
public interface OnLoadFinishListener{
public void onLoadFinish();
}
public void setOnLoadFinishListener(OnLoadFinishListener onLoadFinishListener){
this.mOnLoadFinishListener = onLoadFinishListener;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
lasttime = System.currentTimeMillis();
if(null == mHandler){
mHandler = new Handler();
}
mHandler.postDelayed(mdelay, 550);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
mHandler = getHandler();
if(mHandler == null){
mHandler = new Handler();
}
}
@Override
protected void onDetachedFromWindow() {
if(mHandler != null){
mHandler.removeCallbacksAndMessages(null);
mHandler = null;
mdelay = null;
}
if(mOnLoadFinishListener!= null){
mOnLoadFinishListener.onLoadFinish();
mOnLoadFinishListener = null;
}
super.onDetachedFromWindow();
}
}
方案2也并不完美唐瀑,比如當(dāng)網(wǎng)絡(luò)不好的時(shí)候,延時(shí)超過(guò)500毫秒的時(shí)候插爹,我們的加載進(jìn)度條仍然會(huì)消失哄辣。但是相比其他方案请梢,已經(jīng)精準(zhǔn)多了。
若果想要解決網(wǎng)絡(luò)延時(shí)下的加載顯示問(wèn)題力穗,可能還得進(jìn)一步優(yōu)化毅弧,這個(gè)如果我以后做了這方面的工作,會(huì)再寫(xiě)文章做進(jìn)一步的補(bǔ)充当窗。
看到這篇文章的小伙伴們滚秩,如果你們有更加好的方案甜害,請(qǐng)?jiān)诒M情鄙視作者的同時(shí)記得加QQ群分享一下方案啊,這樣你喊我LOW B我也很開(kāi)心。
方案3
這兩天忽然發(fā)現(xiàn)了別的人寫(xiě)的一篇文章躬审,在這里貼一下,
原文鏈接
關(guān)鍵代碼:
boolean loadingFinished = true;
boolean redirect = false;
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String urlNewString) {
if (!loadingFinished) {
redirect = true;
}
loadingFinished = false;
view.loadUrl(urlNewString);
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap facIcon) {
loadingFinished = false;
//SHOW LOADING IF IT ISNT ALREADY VISIBLE
}
@Override
public void onPageFinished(WebView view, String url) {
if(!redirect){
loadingFinished = true;
}
if(loadingFinished && !redirect){
//HIDE LOADING IT HAS FINISHED
} else{
redirect = false;
}
}
});