wendux / DSBridge-Android

:earth_americas: A modern cross-platform JavaScript bridge, through which you can invoke each other's functions synchronously or asynchronously between JavaScript and native.
3.78k stars 618 forks source link

请问原生调用js能不能传实体 #83

Closed is1988 closed 6 years ago

is1988 commented 6 years ago

看了DEMO只看到传数组,请问原生如何传递实体给js,大概需求是原生调用服务器返回json,转成实体后传给js解析渲染页面(或者直接给js传json,主要可能是我原生写的多,思维固定了)。 另外js里面是否可以直接做ajax请求,得到数据后直接自己渲染页面。因为js自己写的不是很好,还请大神指点一二。

is1988 commented 6 years ago
 public class JsApi {
        @JavascriptInterface
        public void getNative(Object msg) {
            User[] users = new User[1];
            users[0] = new User("android", "10");
            dwebView.callHandler("setView", users, new OnReturnValue<Integer>() {
                @Override
                public void onValue(Integer retValue) {
                    //showToast(retValue);
                }
            });
        }
    }
 // 原生的调用 接收user对象
   dsBridge.register('setView', function (obj) {
        alert(obj)
    })

   // js页面上的按钮 点击后调用原生getNative
    function call() {
        dsBridge.call("getNative", "1")
    }

但是alert的时候提示的是空

is1988 commented 6 years ago
    public class JsApi {
        @JavascriptInterface
        public void getNative(Object msg) {
            //User user =  new User("android", "10");
            dwebView.callHandler("setView", new Object[]{"{\"name\":\"android\",\"address\":\"北京市西城区\",\"age\":25}"}, new OnReturnValue<Integer>() {
                @Override
                public void onValue(Integer retValue) {
                    //showToast(retValue);
                }
            });
        }
    }
    dsBridge.register('setView', function (data) {
        alert(data)
        var json = JSON.parse(data);
        alert(json.address)
    })

改成传json串后正常,看到文档你说fly.js可以解决ajax跨域请求问题,研究ing

VliceZ commented 5 years ago

看了DEMO只看到传数组,请问原生如何传递实体给js,大概需求是原生调用服务器返回json,转成实体后传给js解析渲染页面(或者直接给js传json,主要可能是我原生写的多,思维固定了)。 另外js里面是否可以直接做ajax请求,得到数据后直接自己渲染页面。因为js自己写的不是很好,还请大神指点一二。

你好,有同样的疑问,如果有网络请求数据的话我只能在JSapi里写网络请求吗,可是我希望在Activity里发起请求,请求到网络数据,再将事件注册并填入网络请求数据供前端调用,这种情况应该怎么处理呢。

is1988 commented 5 years ago

看了DEMO只看到传数组,请问原生如何传递实体给js,大概需求是原生调用服务器返回json,转成实体后传给js解析渲染页面(或者直接给js传json,主要可能是我原生写的多,思维固定了)。 另外js里面是否可以直接做ajax请求,得到数据后直接自己渲染页面。因为js自己写的不是很好,还请大神指点一二。

你好,有同样的疑问,如果有网络请求数据的话我只能在JSapi里写网络请求吗,可是我希望在Activity里发起请求,请求到网络数据,再将事件注册并填入网络请求数据供前端调用,这种情况应该怎么处理呢。

目前项目中已经实现了,就是原生给JS传实体前,先转成JSON串,JS接收到后再转成实体,为了跨平台,大部分网络请求都使用ajax,这样android和iOS的原生代码量就很少,便于更多人维护。

VliceZ commented 5 years ago

看了DEMO只看到传数组,请问原生如何传递实体给js,大概需求是原生调用服务器返回json,转成实体后传给js解析渲染页面(或者直接给js传json,主要可能是我原生写的多,思维固定了)。 另外js里面是否可以直接做ajax请求,得到数据后直接自己渲染页面。因为js自己写的不是很好,还请大神指点一二。

你好,有同样的疑问,如果有网络请求数据的话我只能在JSapi里写网络请求吗,可是我希望在Activity里发起请求,请求到网络数据,再将事件注册并填入网络请求数据供前端调用,这种情况应该怎么处理呢。

目前项目中已经实现了,就是原生给JS传实体前,先转成JSON串,JS接收到后再转成实体,为了跨平台,大部分网络请求都使用ajax,这样android和iOS的原生代码量就很少,便于更多人维护。

我们的需求可以理解为,前端js传给我一个商品id,我原生去发请求,发完请求后注册事件并传入请求数据给前端js调用,流程就是 原生调前端→原生发请求,请求成功回调里注册事件给前端 →前端调原生并拿到请求数据,这种逻辑可能会有几层嵌套,这种用DSBridge一开始就加载好JSapi的写法实在不知道该如何下手,方便的话可以留一个沟通方式吗,希望可以详细请教一下。