android调weex方法,Android集成weex汇总
集成环境
IDE Android studio v3.1.2
JDK jdk1.8
根据文档说明,我一路next走下来,发现并不能正常跑起来,经baidu,google,github后,整理出一套完整的集成步骤;
首先说一下文档上的内容
1、app module下添加依赖(我的targetSdkVersion 28 )
implementation 'org.apache.weex:sdk:0.28.0'
// fastjson
implementation 'com.alibaba:fastjson:1.1.46.android'
//support library dependencies
implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation 'com.android.support:support-v4:27.1.1'
implementation 'com.android.support:appcompat-v7:28+'
2、app androidManifast 添加权限
//网络
//sd卡读写
此时先省略混淆方案
3、初始化SDK
InitConfig config = new InitConfig.Builder().build();
WXSDKEngine.initialize(applicationContext,config);
4、初始化WXSDKInstance 的 MainActivity代码
public class MainActivity extends AppCompatActivity implements IWXRenderListener {
WXSDKInstance mWXSDKInstance;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWXSDKInstance = new WXSDKInstance(this);
mWXSDKInstance.registerRenderListener(this);
/**
* bundleUrl source http://dotwe.org/vue/38e202c16bdfefbdb88a8754f975454c
*/
String pageName = "WXSample";
String bundleUrl = "http://dotwe.org/raw/dist/38e202c16bdfefbdb88a8754f975454c.bundle.wx";
mWXSDKInstance.renderByUrl(pageName, bundleUrl, null, null,WXRenderStrategy.APPEND_ASYNC);
}
@Override
public void onViewCreated(WXSDKInstance instance, View view) {
setContentView(view);
}
@Override
public void onRenderSuccess(WXSDKInstance instance, int width, int height) {
}
@Override
public void onRefreshSuccess(WXSDKInstance instance, int width, int height) {
}
@Override
public void onException(WXSDKInstance instance, String errCode, String msg) {
}
@Override
protected void onResume() {
super.onResume();
if(mWXSDKInstance!=null){
mWXSDKInstance.onActivityResume();
}
}
@Override
protected void onPause() {
super.onPause();
if(mWXSDKInstance!=null){
mWXSDKInstance.onActivityPause();
}
}
@Override
protected void onStop() {
super.onStop();
if(mWXSDKInstance!=null){
mWXSDKInstance.onActivityStop();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mWXSDKInstance!=null){
mWXSDKInstance.onActivityDestroy();
}
}
}
WXSDKInstance是weex渲染页面的基本单元,此时注册了渲染监听,添加了视图.
到此时按照文档说明,应该是可以运行了,运行结果是 Hello World
run app.....
但是运行的结果 是一片空白
IWXRenderListener的方法 onException执行结果打印如下:
-1001//degradeToH5|createInstance fail|wx_create_instance_error isJSFrameworkInit==false reInitCount == 1
可以看出创建weex实例失败
此时我是一脸懵牛逼,作为官方文档,居然跑不通,简直匪夷所思。
5、查看一下源码:
WEEXSDK 初始化的方法
WXSDKEngine.initialize(MyWeex.this,config);
/**
@param application
@param config initial configurations or null
*/
public static void initialize(Application application,InitConfig config){
synchronized (mLock) {
if (mIsInit) {
return;
}
long start = System.currentTimeMillis();
WXEnvironment.sSDKInitStart = start;
if(WXEnvironment.isApkDebugable(application)){
WXEnvironment.sLogLevel = LogLevel.DEBUG;
}else{
WXEnvironment.sLogLevel = LogLevel.WARN;
}
doInitInternal(application,config);
registerApplicationOptions(application);
WXEnvironment.sSDKInitInvokeTime = System.currentTimeMillis()-start;
WXLogUtils.renderPerformanceLog("SDKInitInvokeTime", WXEnvironment.sSDKInitInvokeTime);
mIsInit = true;
}
}
private static void doInitInternal(final Application application,final InitConfig config){
WXEnvironment.sApplication = application;
if(application == null){
WXLogUtils.e(TAG, " doInitInternal application is null");
WXExceptionUtils.commitCriticalExceptionRT(null,
WXErrorCode.WX_KEY_EXCEPTION_SDK_INIT,
"doInitInternal",
WXErrorCode.WX_KEY_EXCEPTION_SDK_INIT.getErrorMsg() + "WXEnvironment sApplication is null",
null);
}
WXEnvironment.JsFrameworkInit = false;
WXBridgeManager.getInstance().postWithName(new Runnable() {
@Override
public void run() {
long start = System.currentTimeMillis();
WXSDKManager sm = WXSDKManager.getInstance();
sm.onSDKEngineInitialize();
if(config != null ) {
sm.setInitConfig(config);
}
WXSoInstallMgrSdk.init(application,
sm.getIWXSoLoaderAdapter(),
sm.getWXStatisticsListener());
final IWXUserTrackAdapter userTrackAdapter= config!=null?config.getUtAdapter():null;
final int version = 1;
mIsSoInit = WXSoInstallMgrSdk.initSo(V8_SO_NAME, version, userTrackAdapter);
WXSoInstallMgrSdk.copyJssRuntimeSo();
if(config!=null) {
for (String libraryName : config.getNativeLibraryList()) {
WXSoInstallMgrSdk.initSo(libraryName, version, userTrackAdapter);
}
}
if (!mIsSoInit) {
WXExceptionUtils.commitCriticalExceptionRT(null,
WXErrorCode.WX_KEY_EXCEPTION_SDK_INIT,
"doInitInternal",
WXErrorCode.WX_KEY_EXCEPTION_SDK_INIT.getErrorMsg() + "isSoInit false",
null);
return;
}
sm.initScriptsFramework(config!=null?config.getFramework():null);
WXEnvironment.sSDKInitExecuteTime = System.currentTimeMillis() - start;
WXLogUtils.renderPerformanceLog("SDKInitExecuteTime", WXEnvironment.sSDKInitExecuteTime);
}
},null,"doInitWeexSdkInternal");
WXStateRecord.getInstance().startJSThreadWatchDog();
register();
}
看到这里可以看出,初始化时异步的。还有一种说法,是ndk架构问题,而文档第一行提示:
weex 支持
x86
armeabi-v7a
arm64-v8a
但是翻遍了文档,我也没发现在哪里下载so文件。根据这个哥们的指引,才发现是weex依赖版本问题,
由于weex 0.28.0的调整,以前版本自动引入的facebook提供的JS引擎js-android,现在被修改为需要手工引入,但是文档没有清晰的指出这个问题,导致运行的时候,会由于找不到libjsc.so而导致WXSDKEngine初始化失败。
6、添加libjsc.so文件
app module build.gradle 中添加依赖
同时配置ndk架构
ndk{
abiFilters "armeabi-v7a", "arm64-v8a", "x86"
}
build project后
还要补充一下WXSDKEngine属性和调试模式
public class MyWeex extends Application {
@Override
public void onCreate() {
super.onCreate();
InitConfig config = new InitConfig.Builder()
.setHttpAdapter(new DefaultWXHttpAdapter()).build();
WXSDKEngine.initialize(MyWeex.this,config);
WXBridgeManager.updateGlobalConfig("wson_on");
WXEnvironment.setOpenDebugLog(true);
WXEnvironment.setApkDebugable(true);
WXSDKEngine.addCustomOptions("appName", "WXSample");
WXSDKEngine.addCustomOptions("appGroup", "WXApp");
}
}
完整的代码如下:
app build.gradle文件
apply plugin: 'com.android.application'
apply from: 'https://www.mobibrw.com/wp-content/uploads/2019/11/download_jsc.gradle'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.nade.weex"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ndk{
abiFilters "armeabi-v7a", "arm64-v8a", "x86"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'org.apache.weex:sdk:0.28.0'
// fastjson
implementation 'com.alibaba:fastjson:1.1.46.android'
//support library dependencies
implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation 'com.android.support:support-v4:27.1.1'
implementation 'com.android.support:appcompat-v7:28+'
}
MyWeex Application
public class MyWeex extends Application {
@Override
public void onCreate() {
super.onCreate();
InitConfig config = new InitConfig.Builder()
.setHttpAdapter(new DefaultWXHttpAdapter()).build();
WXSDKEngine.initialize(MyWeex.this,config);
WXBridgeManager.updateGlobalConfig("wson_on");
WXEnvironment.setOpenDebugLog(true);
WXEnvironment.setApkDebugable(true);
WXSDKEngine.addCustomOptions("appName", "WXSample");
WXSDKEngine.addCustomOptions("appGroup", "WXApp");
}
}
MainActivity
public class MainActivity extends AppCompatActivity implements IWXRenderListener {
private WXSDKInstance wxsdkInstance;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
/**
* 轮询访问 WXSDKEngine 初始化状态 防止异步造成的初始化失败问题
*/
if (msg.what == 1) {
if (WXSDKEngine.isInitialized()) {
startRender();
}else {
handler.sendEmptyMessageDelayed(1,300);
}
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
wxsdkInstance = new WXSDKInstance(this);
wxsdkInstance.registerRenderListener(this);
if (WXSDKEngine.isInitialized()) {
startRender();
}else {
handler.sendEmptyMessageDelayed(1,300);
}
}
/**
* WXSDKEngine 初始化成功后 开始渲染
*/
private void startRender() {
String pageName = "WXSample";
/**
* 防止空指针
*/
if (wxsdkInstance == null) {
wxsdkInstance = new WXSDKInstance(this);
wxsdkInstance.registerRenderListener(this);
}
/**
* 渲染远程js
*/
String bundleUrl = "http://dotwe.org/raw/dist/38e202c16bdfefbdb88a8754f975454c.bundle.wx";
wxsdkInstance.renderByUrl(pageName, bundleUrl, null, null, WXRenderStrategy.APPEND_ASYNC);
/**
* 渲染本地js
*/
// String bundleUrl = "index.js";
// wxsdkInstance.render(pageName, WXFileUtils.loadAsset(bundleUrl,this), null, null, WXRenderStrategy.APPEND_ASYNC);
}
/**
* 重写生命周期方法
*/
@Override
protected void onResume() {
super.onResume();
if (wxsdkInstance != null) {
wxsdkInstance.onActivityResume();
}
}
@Override
protected void onPause() {
super.onPause();
if (wxsdkInstance != null) {
wxsdkInstance.onActivityPause();
}
}
@Override
protected void onStop() {
super.onStop();
if (wxsdkInstance != null) {
wxsdkInstance.onActivityStop();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (wxsdkInstance != null) {
wxsdkInstance.onActivityDestroy();
}
}
@Override
public void onViewCreated(WXSDKInstance instance, View view) {
/**
* 填充视图
*/
setContentView(view);
}
@Override
public void onRenderSuccess(WXSDKInstance instance, int width, int height) {
}
@Override
public void onRefreshSuccess(WXSDKInstance instance, int width, int height) {
}
@Override
public void onException(WXSDKInstance instance, String errCode, String msg) {
Log.d("welog", "onException: "+errCode+"//"+msg);
}
}
此时,就可以进行Run app 了 当然运行结果是hello world,欢迎讨论指正。
android调weex方法,Android集成weex汇总相关推荐
- android webview调js方法,Android中WebView与H5的交互,Native与JS方法互调
项目中经常用到WebView与H5的交互,一个是H5调本地方法,一个是本地调H5方法,在此记录一下. 首先,启用JS支持 //启用js支持 webSettings.setJavaScriptEnabl ...
- android倒计时实现方法,Android实现倒计时方法汇总
Android开发中经常会有倒计时的功能,下面将总结出常见的集中实现方式. 1.直接使用Handler的消息机制来实现 xml布局中文件如下: android:layout_width="m ...
- android studio复写方法,Android Studio 常用快捷键
以下是对 Android Studio 默认风格 的常用快捷键汇总: 快捷键 说明 Ctrl + X 剪切 Ctrl + D 在当前下方复制一行 Ctrl + E 查看最近打开的文件 Ctrl + N ...
- android datepicker使用方法,android DatePicker
Date Picker 提供了一个构件去选择一个时间,使用DatePicker构件,该构件允许用户去选择月,日,年在一个界面中. 实例介绍 首先我们应该先创建一个DatePickerDialog,该D ...
- android view使用方法,Android View构造方法第三参数使用方法详解
我们都知道,在Android中要使用一个View,一般会有两种方式: 在XML文件中配置: 直接在代码中new一个View的对象. 我们今天讨论的内容就是围绕着View的构造方法的. 1.实例 首先我 ...
- android返回键方法,Android按返回键(后退键)Back键事件捕获的两种方法
package zhangphil.back; import android.support.v7.app.ActionBarActivity; import android.util.Log; im ...
- android avd 使用方法,Android中Android Virtual Device(AVD)使用教程
AVD的全称为:Android Virtual Device,就是Android运行的虚拟设备,他是Android的模拟器识别.建立的Android要运行,必须创建AVD,每个AVD上可以配置很多的运 ...
- android datepicker使用方法,android中DatePicker和TimePicker的使用方法详解
本文以实例讲述了android中DatePicker和TimePicker的使用方法,具体步骤如下: 下面是实现具体功能的代码,其中main.xml代码为: android:layout_width= ...
- android view使用方法,android – 如何使用getView()方法,它在哪里被调用?
我是Android开发的新手,并且一直遵循Android网站上提供的教程.我目前在视图教程部分,特别是Grid Views: Hello, Grid View Tutorial的教程. 我无法通过适配 ...
- Android代码混淆方法,Android 代码混淆零基础入门
内容提要 本篇文章主要有三个部分,让读者读完后能自己写规则混淆项目 对Android代码怎么开启混淆做一个简单的介绍. 对混淆规则做一个简单介绍: 在混淆过后Crash日志反推代码工具retrace. ...
最新文章
- WIN7 任务栏放右侧 有个BUG
- vue 复选框的渲染
- 在vs2005中使用loki的方法
- [转]MyBatis的foreach语句详解
- 使用report CFD_CREATE_FIELD创建extension field
- 【干货】”首个“ .NET Core 验证码组件
- LeetCode 1030. 距离顺序排列矩阵单元格(排序Lambda表达式BFS)
- linux远程监控毕业设计,毕业设计论文:基于嵌入式Linux远程监控系统的设计与实现.doc...
- 使用 node.js 进行服务器端 JavaScript 编程
- Mysql 格式化日期格式
- 用Blink打造你的技术朋友圈
- 自己定制树莓派Linux内核的步骤
- Mac 使用rz sz 命令
- 数据安全--安全网关
- qemu安卓版免root_用qemu运行一个小小Linux系统
- FIRST集合基本构造
- 解密excel.xls文件密码
- 长视频请回答2020:技术如何让流媒体更“酷”?
- 黑群晖Apache Http Server 启动失败错误
- 【CC0素材网站大全】100个国外高品质免费可商用CC0的图片素材网站!包含大量摄影素材、创意素材、壁纸素材、图标网站等...