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);
    }
    });

    }

    }

  • 相关阅读:
    将项目发布到多台服务器并解决高并发
    Nginx 反向代理和负载均衡
    Nginx的基本理论
    图片上传功能(EasyUI前台框架+SSM框架)
    错误:Eclipse老是出现 updating error reports database
    JPA
    Java中 @override 报错
    SpringBoot常用注解
    SpringBoot学习:整合shiro(rememberMe记住我后自动登录session失效解决办法)
    SpringBoot学习:整合shiro(rememberMe记住我功能)
  • 原文地址:https://www.cnblogs.com/ly570/p/11291185.html
Copyright © 2011-2022 走看看