Weex-eros Android框架工程
本部分主要面向android原生开发者,旨在介绍weex-eros-android框架的项目结构和设计思路,方便广大weex开发者进行weex原生拓展开发。
一.功能介绍
weex-eros是在weex原生拓展的基础上,结合我团队具体项目业务场景,总结出来的一套易用性强,侵入性低,快速集成开发的框架,框架中集成内置module,包括路由,本地存储,网络请求,全局参数配置,事件发布订阅,调用摄像头等,基本涵盖大部分业务场景需求,且提供了自定义接口,方便开发者自定义实现。
二.项目依赖
目前提供了源码依赖的方式,这是我们比较推荐的方式。如果你使用Android Studio进行开发,你可将项目源码做为Moudle导入项目中,在app的build.gradle中添加如下依赖:
compile project(':wxframework')
关于gradle和maven的依赖方式,我们将以迅雷不及掩耳之势在后续更新放出。
三.项目目录结构
Eros项目的目录结构如下:
项目目录结构
·
|-- BMInitConfig initConfig
|-- BMWXApplication 封装的Application
|-- BMWXEngine 框架初始化引擎
|-- BMWXEnvironment 框架上下文
|-- activity 封装的activity,包括提供weex渲染和一些默认实现页面
|-- AbstractWeexActivity
|-- adapter 框架对功能模块具体实现类
|-- router
|-- DefaultImageAdapter
|-- DefaultStorageAdapter
|-- constant 常量类
|-- event 处理与js交互的自定义事件
|-- extend weex原生的拓展
|-- adapter
|-- DefaultWXHttpAdapter 拓展weex原生IWXHttpAdapter
|-- DefaultWXImageAdapter 拓展weex原生IWXImgLoaderAdapter
|-- components 自定义weex组件
|-- module 自定义weex module
|-- http http实现(默认使用okhttp)
|-- manager 业务处理管理类
|-- model java beans
|-- utils utils
四.关键类
总览Eros项目的工程目录,有些类是我们需要特别注意的:
DefaultWXHttpAdapter
此类是weex原生暴露接口IWXHttpAdapter 的子类,在官方介绍中,重写IWXHttpAdapter 中sendRequest可以拦截JsBundle资源的加载,自定义JsBundle 的加载策略。在Eros中,DefaultWXHttpAdapter 在自定义JsBundle 资源的加载方式之外,还实现了对本地资源和远端资源的加载策略。
public void sendRequest(final WXRequest request, final OnHttpListener listener) {
if (listener != null) {
listener.onHttpStart();
}
execute(new Runnable() {
@Override
public void run() {
if (!(Constant.INTERCEPTOR_ACTIVE.equals(SharePreferenceUtil.getInterceptorActive
(mContext))) || !isInterceptor(request
.url)) {
fetchUrl(request, listener);
} else {
doInterceptor(request, listener);
}
}
});
}
可以看到,当激活资源拦截器时,JsBundle的加载将指向本地,而关闭拦截是,资源将从远端加载。通过这样的方式,满足了开发阶段js资源实时调试和项目发布后静态资源的本地加载。由于从底层拦截了整体资源的加载,很多的工作都可以优雅的完成,比如统计。DefaultWXHttpAdapter 的具体实现可以参看源码,本文最后。
DefaultWXImageAdapter
此类是weex原生暴露接口IWXImgLoaderAdapter 的子类,重写setImage方法,可以自定义整个项目图片的加载。DefaultWXImageAdapter 提供了默认的图片加载方式及缓存策略,同时还支持了gif和占位图的加载,默认的图片加载框架为Glide。Fresco和ImageLoader的粉丝也不用担心,你只需要重写DefaultWXImageAdapter的setImage方法即可自定义实现。
public void setImage(final String url, final ImageView view,
WXImageQuality quality, final WXImageStrategy strategy) {
if (url == null) return;
Glide.with(WXEnvironment.getApplication()).load(url).diskCacheStrategy(DiskCacheStrategy
.ALL).into(new
BMGlideDrawableImageTarget
(view, strategy, validatePlaceHolder(strategy), url));
}
BMWXEngine
此类是Eros框架的初始化入口,请在你的项目入口调用initialize方法完成初始化。
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
BMWXEngine.initialize(this, new BMInitConfig.Builder().isActiceInterceptor(Constant
.INTERCEPTOR_ACTIVE).build());
}
}
BMWXEngine内部将完成weex框架的初始化和内置moudle,component的注册以Enviroment.config的参数配置。
public static void initialize(Application context, BMInitConfig initConfig) {
initPlatformConfig(context);
initConing(initConfig);
engineStart(context);
registerBMComponentsAndModules(context);
initHttpClient(context);
initInterceptor(context, initConfig);
initDispatchCenter();
}
此外,为了方便于js端的数据交互,你可以通过BMInitConfig将一些参数放入全局环境中:
HashMap<String,String> envs=new HashMap<>();
envs.put("test","test");
BMWXEngine.initialize(this, new BMInitConfig.Builder().setCustomerEnv(envs).build());
js端可以使用weex.enviroment.config
获取。
AbstractWeexActivity
此类为Application的子类,将你项目的Application继承它,便可以自动完成Eros框架的初始化和内置moudle,component的注册,方便开发者快速集成。
public class BMWXApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
}
private void initWeex() {
BMWXEngine.initialize(this, new BMInitConfig.Builder().isActiceInterceptor(Constant
.INTERCEPTOR_ACTIVE).build());
}
}
五 .项目地址
目前Eros项目的框架部分已经完全开源,项目地址:https://github.com/aa453509345/WeexErosFramework
另外WeexErosFramework项目所依赖的WeexSDK是我们在Weex原生SDK的基础上,修复了原生SDK的部分bug所维护的SDK,项目地址:https://github.com/aa453509345/WeexSDK
目前Eros项目还在快速开发迭代中,对于功能复杂或自定义程度高度制定的场景支持可能还不够完善,我们会在后续版本中支持完善, 也希望广大weex开发者和开源爱好者提出建议,共同完善Eros。
有任何问题和建议的童鞋,可以扫描首页二维码,加入weex-eros唯一官方微信圈交流讨论。