如何从本机模块触发事件

时间:2014-05-04 14:54:58

标签: java android titanium titanium-modules

CLI版本3.2.3,Titanium SDK版本3.2.2.GA

我正在使用外部jar文件并尝试使其适用于本机模块,以便本机模块可以与钛一起使用

我无法从处理程序中触发事件

我在本机模块中有两个类 clsModule和Handler

clsModule.java

import ext.Extclient;

@Kroll.module(name="extclient", id="ti.extclient")
public class clsModule extends KrollModule{

private Handler h ;
Extclient ext ;

public clsModule()
    {
    super();
    ext = new Extclient();
     h = new Handler(this);
    im.addHandler(h);
    }
}

Handler.java

import ext.ResponseHandler;

public class Handler implements ResponseHandler 
    {

public void OnConnected(String arg0, String arg1) {
HashMap<String, Object> event = new HashMap<String, Object>();
    event.put("u1", arg0);
    event.put("u2", arg1);

    //How do i fire a event here ?

    }
}

我尝试使用fireEvent,但是没有用,它会给出一个未定义的错误。

1 个答案:

答案 0 :(得分:1)

您的模块(与所有模块一样)扩展KrollModule,扩展KrollProxy,用于处理事件。您的Handler类无权访问此对象,因此它无法触发事件本身,但是您已经传递了该引用(new Handler(this)),所以只需使用它!

import ext.ResponseHandler;

public class Handler implements ResponseHandler {
    private KrollModule proxy; // Hold onto this reference
    public Handler(KrollModule proxy) {
        this.proxy = proxy;
    }

    public void OnConnected(String arg0, String arg1) {
        // Fire event if anyone is listening
        if (proxy.hasListeners("colorChange")) {
            HashMap<String, Object> event = new HashMap<String, Object>();
            event.put("u1", arg0);
            event.put("u2", arg1);
            proxy.fireEvent("colorChange", hm);
        }
    }
}

这是一般的想法,通过代理将事件激发到类本身,另一种方法是在模块内部内联ResponseHandler的匿名实现。我不确定你是否正确实施ResponseHandler,或者如果OnConnected甚至被解雇,你需要先检查它。