js与本地java通信 原创

cqyin
发布于 2021-8-18 09:10
浏览
0收藏

介绍

这里介绍下api6新出的js fa与本地java pa的通信,可以去鸿蒙官网 JS LocalParticleAbility机制 学习。

环境配置

1、新建js项目后,需要修改:
1) 项目根目录下的build.gradle,sdk版本修改,如下:

    compileSdkVersion 6
    defaultConfig {
        compatibleSdkVersion 6
    }

2) moudle下的build.gradle,sdk版本修改,同上;
3) 修改完成后,执行右上角sync now按钮。
js与本地java通信-鸿蒙开发者社区
2、 模拟器同样需要选择api6的,如下图:
js与本地java通信-鸿蒙开发者社区

java端

  1. 写一个自己的类继承自LocalParticleAbility,继承后里面的pulic方法js端均可以访问到,代码如下:
import ohos.ace.ability.LocalParticleAbility;

public class MyJSInterface implements LocalParticleAbility {
    public static LocalParticleAbility getInstance(){
        return new MyJSInterface();
    }

    public int plusSync(int number1,int number2){
        return number1+number2;
    }

    public void plusAsync(int number1,int number2,Callback callback){
        if (callback == null) return;
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                callback.reply(number1+number2);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                callback.reply(number1-number2);
            }
        }).start();

    }
}

    1) 同步方式(方法:plusSync),直接return结果,js会接收到一个Promise对象。
    2) 异步方式(方法:plusAsync),开启线程模拟异步操作,利用Callback对象将数据返回给js。
2. 需要在js加载对应的ablility注册

public class MainAbility extends AceAbility {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        MyJSInterface.getInstance().register(this);
    }

    @Override
    public void onStop() {
        super.onStop();
        MyJSInterface.getInstance().deregister(this);
    }
}

js端

不要在js中onInit中调用,因为此时Java接口对象还未创建完成。java的同步方式返回的是Promise对象;java的异步方式是通过Callback对象给js返回数据,可以返回多次,具体代码如下:

        let javaSer = createLocalParticleAbility("com.example.jsjavaconlocal.MyJSInterface");
        javaSer.plusSync(1,2).then(result=>{
            console.log(`结果是:${ result }`)
        },error=>{

        });
        javaSer.plusAsync(1,2,result=>{
            console.log(`结果是:${ result }`)
        })

执行结果:
1) 同步结果
    app Log: 结果是:3
2) 异步结果
    app Log: 结果是:3
    app Log: 结果是:-1

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
已于2021-8-18 09:10:13修改
2
收藏
回复
举报
2条回复
按时间正序
/
按时间倒序
Whyalone
Whyalone

“java的异步方式是通过Callback对象给js返回数据,可以返回多次”这个返回多次是为了防止JS收不到返回数据?

回复
2021-8-18 10:35:20
cqyin
cqyin 回复了 Whyalone
“java的异步方式是通过Callback对象给js返回数据,可以返回多次”这个返回多次是为了防止JS收不到返回数据?

应该不是,可以返回不同的数据,而且js可以接收到不同值,应该类似于java持有了一个js类,java可以通过此类的方法给js设置值。

回复
2021-8-18 16:49:38
回复
    相关推荐