android+混编框架,Android 混编框架 (2)

这里我对 WebViewClient 进行了封装,目的在于重写 shouldOverrideUrlLoading 方法,对web端发起请求按 schema 进行区分,区分为 http 请求和我们对原生方法的请求,public class SpWebViewClient extends WebViewClient

我们创建一个 SpWebViewClient 来继承 WebViewClient,也就是 WebViewClient 进行封装。@Override

public boolean shouldOverrideUrlLoading(WebView webView, String url) {

Uri parse = Uri.parse(url);//解析请求的 url

String scheme = parse.getScheme();//获取 url 的sheme

//

if(SpConfig.SCHEME.equals(scheme)){//判断 scheme 是否为 zidea,如果为 zidea 则进行对原生方法请求

String host = parse.getHost();// 获取 host 也就是原生的方法名

String param = parse.getQueryParameter(SpConstant.GET_PARAM);//获取参数

String callback = parse.getQueryParameter(SpConstant.GET_CALLBACK);//获取参数

try {                //这是一个分发方法,根据 host(方法名称、参数、回到)调用进行分发

spDispatcher(host,param,callback);

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InstantiationException e) {

e.printStackTrace();

}

}        //这里需要控制,只有注册方法才能被调用,没有注册方法不会被调用

return false;

}

这个分发类 spDispatcher 负责根据方法名称、参数和回调将这些参数分发给对应处理的原生方法,这里所有原生方法都是 Action。private void spDispatcher(String method, String params,String jsmethod) throws IllegalAccessException, InstantiationException{        //方法名称获取到获取对应的类,参见下图

Class type = SpConfig.ActionMapping.mapping(method);        //我们实例化一个对应的 Action

SpAction action = (SpAction) type.newInstance();      //因为所有 Action 都实现 onAction 这也就是我们调用的具体原生方法,这部分内容稍后解释,大家只需要有一个印象

action.onAction(mWebView,params,jsmethod);

}

这里我们注册方法名称对应一个处理的类,这些类都实现 SpAction ,我们通过方法名称可以对应获取类。public static class ActionMapping{

private static HashMap mMap;        //注册动作

static {

mMap = new HashMap<>();

mMap.put("forward",SpActionForward.class);

mMap.put("startActivity", StartActivityAction.class);

mMap.put("startConversation", StartConversationAction.class);

mMap.put("updateTitile", UpdateTitileAction.class);

mMap.put("print",PrintAction.class);

mMap.put("request", RequestAction.class);

}        public static Class mapping(String method){            return mMap.get(method);

}

}我们所有方法都继承这个抽象类,然后需要实现抽象方法 onAction,接受一个 webview 对象、方法参数和 javascript 回调方法。public abstract class SpAction {    public static Gson mGson;    public abstract void onAction(WebView webView,String params, String jsmethod);

}

作者:zidea

链接:https://www.jianshu.com/p/e12bd2f81536

打开App,阅读手记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值