android 基於jsBridge實現js交互時對webview監聽onPageStarted及onPageFinished

最近Android項目中需要實現webview與js交互,網上推薦的框架是https://github.com/lzyzsd/JsBridge
基於jsbridge調用實現webview與js交互具體用法作者已詳細講解不再解釋,本文主要說在實現webview交互後想監聽webview的onPageStarted及onPageFinished實現加載動畫的坑。
js交互代碼

//  JS調JAVA   重點: Java端需要註冊事件監聽,即webView.registerHandler()。PHP需要做的工作:重寫接口回調,
        webView.registerHandler("goodsInfo", new BridgeHandler() {
            @Override
            public void handler(String data, CallBackFunction function) {
                Logger.json(data);
                Map<String, Object> map = JSONFormat.jsonToMap(data);
                String param = (String) map.get("goodsid");
                aCache.put("goodsname", map.get("goodsname") + "");
                aCache.put("goodsimg", "http://" + URLutile.PHPURL + "/" + map.get("goodsimg") + "");
                Intent intent = new Intent(HelpMallActivity.this, GoodsDetailActivity.class);
                intent.putExtra("param", param);
                startActivity(intent);

            }

        });

交互後重點是監聽webview的onPageStarted及onPageFinished實現加載動畫
用的代碼是

webView.setWebViewClient(new WebViewClient()
        {
            @Override
            public void onPageFinished(WebView view, String url)
            {
                super.onPageFinished(view, url);
                stopMyDialog();
            }
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon)
            {

                super.onPageStarted(view, url, favicon);
                startMyDialog();
            }
        });

後發現js交互不能用了,開始查看jsBridge源碼發現BridgeWebViewClient中已經重新寫了onPageStarted及onPageFinished的監聽,兩個衝突了,js交互也就不能用了。

解決辦法
新建一個WebViewClient繼承BridgeWebViewClient

package com.yskj.lsk.widget.circleimageview;

import android.content.Context;
import android.graphics.Bitmap;
import android.webkit.WebView;

import com.github.lzyzsd.jsbridge.BridgeWebView;
import com.github.lzyzsd.jsbridge.BridgeWebViewClient;
import com.yskj.lsk.util.MyLoading;

/**
 * Created by jianghe on 2016/11/18 0018.
 */
public class LocalWebViewClient extends BridgeWebViewClient {
    private MyLoading myloading;
    private Context context;

    public LocalWebViewClient(BridgeWebView webView) {
        super(webView);
    }
    public LocalWebViewClient(BridgeWebView webView, Context context){
        super(webView);
        this.context = context;
    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
        startMyDialog();
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        stopMyDialog();
    }

    /**
    * dialog 啓動
    */
    public void startMyDialog() {
        if (myloading == null) {
            myloading = MyLoading.createLoadingDialog(context);
        }
        if (!myloading.isShowing()) {
            myloading.show();
        }
    }

    /**
     * dialog 銷燬
     */
    public void stopMyDialog() {
        if (myloading != null) {
            if (myloading.isShowing()){
                myloading.dismiss();
            }
            myloading = null;
        }
    }
}

再在web中調用
//監聽加載開始和加載結束
webView.setWebViewClient(new LocalWebViewClient(webView,context));
後一切正常

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章