zoukankan      html  css  js  c++  java
  • 在java中

    // 进入prompt回调
    public class JSBridgeWebChromeClient extends WebChromeClient {
    @Override
    public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
    result.confirm(JSBridge.callJava(view, message));
    return true;
    }
    }

    // 调用java逻辑
    public class JSBridge {
    ...
    public static String callJava(WebView webView, String uriString) {
    String methodName = "";
    String className = "";
    String param = "{}";
    String port = "";
    if (!TextUtils.isEmpty(uriString) && uriString.startsWith("JSBridge")) {
    Uri uri = Uri.parse(uriString);
    className = uri.getHost();
    param = uri.getQuery();
    port = uri.getPort() + "";
    String path = uri.getPath();
    if (!TextUtils.isEmpty(path)) {
    methodName = path.replace("/", "");
    }
    }

    // 基于上面的className、methodName和port path调用对应类的方法
    if (exposedMethods.containsKey(className)) {
    HashMap<String, Method> methodHashMap = exposedMethods.get(className);

    if (methodHashMap != null && methodHashMap.size() != 0 && methodHashMap.containsKey(methodName)) {
    Method method = methodHashMap.get(methodName);
    if (method != null) {
    try {
    method.invoke(null, webView, new JSONObject(param), new Callback(webView, port));
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    }
    return null;
    }
    }

    // 直接进入showToast函数的实现
    public static void showToast(WebView webView, JSONObject param, final Callback callback) {
    String message = param.optString("msg");
    Toast.makeText(webView.getContext(), message, Toast.LENGTH_SHORT).show();
    if (null != callback) {
    try {
    JSONObject object = new JSONObject();
    object.put("key", "value");
    object.put("key1", "value1");
    callback.apply(getJSONObject(0, "ok", object));
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }

    // 上述程序的callback.apply方法实现如下: 即通过webView.loadUrl实现java调用js的方法
    public class Callback {
    private static Handler mHandler = new Handler(Looper.getMainLooper());
    private static final String CALLBACK_JS_FORMAT = "javascript:JSBridge.onFinish('%s', %s);";
    private String mPort;
    private WeakReference<WebView> mWebViewRef;

    public Callback(WebView view, String port) {
    mWebViewRef = new WeakReference<>(view);
    mPort = port;
    }

    public void apply(JSONObject jsonObject) {
    final String execJs = String.format(CALLBACK_JS_FORMAT, mPort, String.valueOf(jsonObject));
    if (mWebViewRef != null && mWebViewRef.get() != null) {
    mHandler.post(new Runnable() {
    @Override
    public void run() {
    mWebViewRef.get().loadUrl(execJs);
    }
    });

    }

    }

  • 相关阅读:
    Activiti6详细教程
    Nginx 与 Tomcat : 413 Request Entity Too Large(请求实体太大)
    windows下安装pytorch
    vim编辑器常用操作
    el-dialog 里面的组件不刷新问题
    el-dialog 里面的 el-form 重置表单问题
    ElementUI树形表格默认展开
    设计模式之 工厂方法模式
    linux创建一个proc代码示例
    redis的安装及使用
  • 原文地址:https://www.cnblogs.com/ly570/p/11291185.html
Copyright © 2011-2022 走看看