luaj luaoc 回调函数传递的一些小总结

问题场景:我们的游戏在支付时,由于第三方支付比较费时,可能在支付的过程中,我们lua写的cocos2dx项目会断网,我们的游戏有自动重连的机制。我就想,如果断线好了以后,支付完成了,那在断网之前传入的回调函数是否能被成功执行到呢?

就在网上发现了这篇文章 http://dualface.github.io/blog/2013/01/01/call-java-from-lua/#lua20function20E79A84E5BC95E794A8E8AEA1E695B0E599A8 , 个人觉得写的超赞。

“Lua 虚拟机中,Lua function 以值的形式保存。但这个值无法直接给 Java 用,所以 luaj 做了一个 Lua function 引用表。当一个 Lua function 传递给 Java 时,这个 function 对应的值会被存在引用表中,并获得一个唯一的引用 ID (整数)。Java 代码拿到这个引用 ID 后,就可以很方便的调用该 Lua function 了。”

“Lua 虚拟机具有自动垃圾回收机制。Lua function 既然是值,那么在没有被使用时自然会被回收掉。所以 luaj 提供了 retainLuaFunction() 和 releaseLuaFunction() 两个函数用于增减 Lua function 的引用计数。

将一个 Lua function 以引用 ID 的形式传入 Java 时,luaj 会自动增加引用 ID 的计数器,所以在 Java 方法里可以放心的异步调用 Lua function。但在不需要使用该 Lua function 后,一定要调用 releaseLuaFunction() 减少该引用 ID 的计数器。当计数器为 0 时,会自动释放该 Lua function。

如果了解 cocos2d-x 中 CCObject 的 autorelease 机制,那么对引用计数应该很熟悉,两者是完全相同的实现机制。”

这两段说的非常好。这样,我就明白,即使lua短线重来回来,因为Lua虚拟机没有重启,那么lua function 引用表也在,并且我没有release, 那肯定是可以回调成功的。顺便这篇文章也告诉了我UI线程和GL线程一些基本知识,推荐。

贴一下我的lua代码和java回调代码

-- android 服务器产生订单后 客户端开始正式购买操作
function androidStartPay(data)
    if isAdroid() == false then
        print("不允许的平台支付")
        disposeLoading()
        payError()
        return
    end

    local presult =  GameDataCenter:GetOrderInfo(data)
    local javaMethodName = "startPay"
    local javaParams = {presult.orderNo, presult.money, userID, userName, presult.payName, userToken, presult.productId, androidPayBack}
    local javaMethodSig = "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V"
    luaj.callStaticMethod(PACKAGE_NAME, javaMethodName, javaParams, javaMethodSig)
end

java简单的回调

private static void setLuaCallback(final int callback, final String result) {
        BaseUtils.D(TAG, "setLuaCallback ========" + result);
        if (callback <= 0) {
            BaseUtils.E(TAG, " callback is null");
            return;
        }
        LuaCallback = 0;
        // 回调lua
//        s_instance.Resume();
//        s_instance.onWindowFocusChanged(true);
        s_instance.runOnGLThread(new Runnable() {
            @Override
            public void run() {
                Cocos2dxLuaJavaBridge.callLuaFunctionWithString(callback,
                        result);
                Cocos2dxLuaJavaBridge.releaseLuaFunction(callback);
            }
        });
    }

luaj luaoc 回调函数传递的一些小总结,布布扣,bubuko.com

时间: 2024-12-15 01:51:05

luaj luaoc 回调函数传递的一些小总结的相关文章

Javascript AJAX回调函数传递参数

在Javascript 中,特别是在AJAX中,回调函数常常是一个函数名,没有地方放入参数,如下面的AJAX代码,在成功后将调用回调函数callback,但callback是有参数的,如何把参数传进来呢? var callback = function(p1){ //do something } var ajaxSetting = { url: url, timeout:me.timeout, type: method, contentType: "application/json",

javascript 的回调函数

既然函数可以像其他数据那样赋值给某个个变量,可以被定义.删除.拷贝,那为什么就不能被当成参数传递给其他函数呢? 下面的示例中,我们定义了一个以两个函数为参数的函数.该函数会分别执行这两个参数函数,并返回它们的返回值之和. function invoke_and_add(a,b){ return a() + b(); } 现在让我们来简单定义一下这两个参与加法运算的函数,它们只是单纯地返回一个硬编码值: function one(){ return 1; } function two(){ ret

理解和使用 JavaScript 中的回调函数

原文:http://javascriptissexy.com/ 在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实际上是一种对象,它可以"存储在变量中,通过参数传递给(别一个)函数(function),在函数内部创建,从函数中返回结果值". 因为function是内置对象,我们可以将它作为参数传递给另一个函数,延迟到函数中执行,甚至执行后

【JavaScript】理解与使用Javascript中的回调函数

在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因为函数是第一类对象,我们可以在Javascript使用回调函数.在下面的文章中,我们将学到关于回调函数的方方面面.回调函数可能是在Javascript中使用最多的函数式编程技巧,虽然在字面上看起来它们一直一小段Javascript或者jQuery代码,但是对于许多开发者来说它任然是一个谜.在阅读本文

javascript 函数初探 (四)--- 回调函数

回调函数 既然函数与任何被赋值给变量的数据是相同的,那么她当然可以像其他数据那样被定义.删除.拷贝,以及当成参数传递给其它函数. 我们定义一个函数,这个函数有两个函数类型的参数,然后他会分别执行这两个参数所执行的函数. function her(){ return a() + b(); } function one(){ return 1; } fucntion two(){ return 2; } her(one, two) // 3 实际上,我们也可以直接用匿名函数(即函数表达式)来替代on

理解与使用Javascript中的回调函数

在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因为函数是第一类对象,我们可以在Javascript使用回调函数.在下面的文章中,我们将学到关于回调函数的方方面面.回调函数可能是在 Javascript中使用最多的函数式编程技巧,虽然在字面上看起来它们一直一小段Javascript或者jQuery代码,但是对于许多开发者来说 它任然是一个谜.在阅读

javascript回调函数(模式)原理和示例深入分析

   广大网友读懂了我之前论述的javascript原理这篇文章很容易懂 回调函数来自一种著名的编程范式--函数式编程,在基本层面上,函数式编程指定的了函数的参数.函数式编程虽然现在的使用范围变小了,但它一直被"专业的聪明的"程序员看作是一种难懂的技术,以前是这样,未来也将是如此. 幸运的是,函数式编程已经被阐述的像你我这样的一般人也能理解和使用.函数式编程最主要的技术之一就是回调函数,你很快会阅读到,实现回调函数就像传递一般的参数变量一样简单.这项技术如此的简单,以至于我都怀疑为什么

理解javascript中的回调函数(callback)【转】

在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实际上是一种对象,它可以"存储在变量中,通过参数传递给(别一个)函数(function),在函数内部创建,从函数中返回结果值". 因为function是内置对象,我们可以将它作为参数传递给另一个函数,延迟到函数中执行,甚至执行后将它返回.这是在JavaScript中使用回调函数的精髓.本篇文

javascript回调函数,闭包作用域,call,apply函数解决this的作用域问题

在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实际上是一种对象,它可以“存储在变量中,通过参数传递给(别一个)函数(function),在函数内部创建,从函数中返回结果值”. 因为function是内置对象,我们可以将它作为参数传递给另一个函数,延迟到函数中执行,甚至执行后将它返回.这是在JavaScript中使用回调函数的精髓.本篇文章的剩余部