最近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));
後一切正常