原理

引擎注入JS维护一个保存回调的队列,调用插件接口时将function参数添加至队列生成function对应Id,并把function参数替换成对应的Id。插件接口根据该Id loadJs调用回调队列的function,并根据实际场景对队列中的function进行移除。从而支持JS的function参数传入。该改动对前端完全透明。

js调用方式

异步回调

在接口调用参数直接添加function参数即可。如

  1. var params = {
  2. };
  3. uexWindow.test(params,function(){
  4. console.log("---------callback---------");
  5. });

支持多个function参数的传入:

  1. var params = {
  2. };
  3. uexWindow.test(params,function(){
  4. console.log("---------callback1--------");
  5. },"params",function(){
  6. console.log("---------callback2--------");
  7. });

支持多个多种参数的回调(包含Json对象):

  1. var params = {
  2. };
  3. uexWindow.test(params,function(result/*String 类型*/,json/*Json对象类型*/,code/*Number 类型*/){
  4. console.log("---------callback---------"+result+json.result+code);
  5. });

如果插件回调接口需要判断是否成功,统一规范第一个参数为int 类型,0表示 成功,非0表示失败,如:

  1. function(error,...){
  2. if(!error){
  3. alert('成功')
  4. }else{
  5. alert('失败')
  6. }
  7. }

同步返回

支持同步返回String类型,JsonObject类型。

同步返回String,如

  1. var query=uexWindow.getUrlQuery();

同步返回JsonObject,如:

  1. var data = {
  2. secret:"APP_SECRET",
  3. code:"CODE",
  4. grant_type:"authorization_code"
  5. };
  6. var result=uexWeiXin.getLoginAccessToken(data);
  7. console.log("access_token: "+result.access_token);
  8. console.log("expires_in: "+result.expires_in);
  9. console.log("openid: "+result.openid);
  10. /**
  11. var result = {
  12. access_token: "ACCESS_TOKEN",
  13. expires_in: 7200,
  14. refresh_token: "REFRESH_TOKEN",
  15. openid: "OPENID",
  16. scope: "snsapi_userinfo",
  17. unionid:"UNIONID"
  18. }
  19. **/

4.0插件改造

Android引擎中EUEXBase提供的接口为:

  1. /**
  2. * 异步回调到JS
  3. * @param callbackId 回调ID,该值由插件接口被调用时传入
  4. * @param hasNext 是否有下一次回调。没有传false ,有传true
  5. * @param args 参数可以是任何对象,直接回调对象可使用DataHelper.gson.toJsonTree()方法
  6. */
  7. public void callbackToJs(int callbackId,boolean hasNext,Object... args)

其中callbackId是由插件接口中传入的。如:

  1. public void test(String[] params){
  2. String jsonStr= (String) params[0];
  3. ResultVO resultVO=new ResultVO();
  4. resultVO.setResult(true);
  5. callbackToJs(Integer.parseInt(params[1]),false,"字符串测试...",DataHelper.gson.toJsonTree(resultVO),666);
  6. }

该接口中定义params数组中第二个参数为function,那么params[1]中的值即为该function的Id。对应的JS代码为:

  1. uexWindow.test(paramStr,function(result/*String 类型*/,json/*Json对象类型*/,code/*Number 类型*/){
  2. console.log("---------callback---------"+result+json.result+code);
  3. });
  • 升级版本号为4.0.0
  • 对于旧的插件,可以在接口参数String[] params中添加参数作为function。如之前参数定义params[0]params[1]作为接口入参,如果需要回调可以把第三个参数作为function接收id。

    为了兼容以前的JS代码,需要判断有没有传入第三个参数。如果有,则调用新的方法进行回调,没有则走之前的cb回调。

  • 打印Log全部使用BDebug

    开启调试开关的方法为在SdCard根目录新建appcandebug.txt

    logToFilelogToFileJson 没有做调试判断。自己调试使用:

    1. if(BDebug.DEBUG){
    2. BDebug.logToFile("")
    3. }
  • callbackToJs 直接回调对象可以使用

    1. DataHelper.gson.toJsonTree(object)
  • callbackToJs 回调JS时是在主线程中进行,插件中子线程可以直接回调

  • 插件中使用widget相关的需要考虑mBrwView.getCurrentWidget()==null的情况,可以获取Root widget:WDataManager.sRootWgt

  • 关于HttpClient的需要全部改成HttpURLConnection,引擎提供的方法为Http.getHttpsURLConnection(url)Http.getHttpsURLConnectionWithCert()

  • 加载图片请使用ACEImageLoader,有其他需求可以在引擎中添加接口

SO相关

有so 的插件只要armeabi,如果没有,将armeabi-v7a目录的so拷贝至armeabi

代码格式

  • 代码请全部使用空格缩进

    Editor -> Code Style->Java->Tabs and Indents->Use tab character

  • Right Margin 设置为120

    Editor -> Code Style->Right Margin ->120