通过前面两篇文章的实践,咱们学习了Weex的使用。本篇开始咱们深刻Weex的源码,一块儿探索Weex在安卓平台上是如何构建一套JS的运行框架,那从Module开始提及吧。html
本文从源码入手分析Module的注册、调用、回调等流程,而且分析一个Weex自带Module的实现。android
在《Android 扩展》中咱们能够看到Module的定位:git
Module 扩展非UI的特定功能,例如 sendHttp、openURL 等。github
也就是说是非UI类型的功能提供,在本地注册供Js运行时调用,有了Module,咱们就能够本身扩展一些Weex没有提供的能力给Js,让Js更增强大!apache
还记不记得在上两篇文章中咱们就用到了Module来实现网络请求的能力,声明+调用即完成了网络请求的调用;bash
var stream = weex.requireModule('stream') // 声明
stream.fetch // 请求复制代码
对于注册,也分为本地注册和Js注册:微信
备注:注册的意义在于Js与Native定义了一个协议,一个对应关系;调用的时候能找到Module。weex
调用分析:网络
调用分析:框架
Module的源码并不复杂:
分析了Module的注册、调用、回调等步骤,咱们就来实例分析一个Weex中自带的Module:WXStreamModule,咱们网络请求的功能就是它实现的,在Weex代码中咱们调用网络请求的是fetch方法,那么咱们在WXStreamModule方法中寻找fetch方法:
@JSMethod(uiThread = false)
public void fetch(String optionsStr, final JSCallback callback, JSCallback progressCallback){
......
String method = optionsObj.getString("method");
String url = optionsObj.getString("url");
JSONObject headers = optionsObj.getJSONObject("headers");
String body = optionsObj.getString("body");
String type = optionsObj.getString("type");
int timeout = optionsObj.getIntValue("timeout");
sendRequest()
......
}复制代码
经过上述optionsObj中获取各类数据的方式,咱们能够推知在Weex代码中怎么去声明想要的参数,例如:Weex的Demo中没有写传递header的例子,咱们查看获取Header的方式也知道须要将其封装成一个JsonObject,从根源来发现解决问题的途径是看源码的好处之一,源码面前了无秘密!
sendRequest是经过IWXHttpAdapter实现的,没有设置的话会使用DefaultWXHttpAdapter;而后在一个FixedThreadPool里经过HttpURLConnection执行的网络请求。
public class DefaultWXHttpAdapter implements IWXHttpAdapter {
private ExecutorService mExecutorService = Executors.newFixedThreadPool(3);
@Override
public void sendRequest(final WXRequest request, final OnHttpListener listener) {
HttpURLConnection connection = openConnection(request, listener);
}
}复制代码
备注:经过细看WXStreamModule的源码咱们不难发现最终网络请求的默认执行类DefaultWXHttpAdapter有必定缺陷,固定线程数的线程池实际上并不适合网络请求的场景,尤为在网络请求密集的场景下(整个模块、甚至应用都使用Weex来作,这种场景不会罕见)。所以若是咱们要大面积使用Weex最好本身实现IWXHttpAdapter或者调用Native的方法。这是看源码的另外一好处:从源码角度分析框架实现的利弊,定制更适合本身业务的实现。
自定义Module比较简单,就不在本文细说了,能够参照官方文档或者自带的Module的实现,也能够参考我写的WeexList,里面有自定义Module的使用。
欢迎持续关注Weex源码分析项目:Weex-Analysis-Project
欢迎关注微信公众号:按期分享Java、Android干货!