C#开发者求助:将自定义事件代码转换为Android实现代码
嗨,这就帮你把C#里的自定义事件逻辑转换成Android平台常用的Java和Kotlin实现,完美对应你说的「MyFirstClass触发MySecondClass自定义事件」的需求:
Java 实现方案
首先定义和C#中MyCustomEventArgs对应的自定义事件参数类:
public class MyCustomEventArgs { private String message; private int code; // 构造方法,用于传递事件携带的数据 public MyCustomEventArgs(String message, int code) { this.message = message; this.code = code; } // Getter方法,供监听器获取事件数据 public String getMessage() { return message; } public int getCode() { return code; } }
接下来是MySecondClass,Android里没有C#直接的event关键字,我们用接口回调来模拟事件机制:
public class MySecondClass { // 定义事件回调接口,相当于C#里的EventHandler委托 public interface MyCustomEventListener { void onCustomEventTriggered(MyCustomEventArgs args); } // 保存注册的监听器(如果需要支持多个监听器,换成List<MyCustomEventListener>即可) private MyCustomEventListener mEventListener; // 对外提供注册事件监听器的方法 public void setMyCustomEventListener(MyCustomEventListener listener) { this.mEventListener = listener; } // 提供移除监听器的方法,避免内存泄漏 public void removeMyCustomEventListener() { this.mEventListener = null; } // 触发事件的方法,可以内部调用也可以暴露给外部(比如MyFirstClass) public void triggerCustomEvent(String message, int code) { // 先判断监听器是否存在,避免空指针 if (mEventListener != null) { mEventListener.onCustomEventTriggered(new MyCustomEventArgs(message, code)); } } }
最后是MyFirstClass,用来触发MySecondClass的自定义事件:
public class MyFirstClass { public void doActionAndTriggerEvent() { MySecondClass secondClass = new MySecondClass(); // 注册事件回调,处理事件触发后的逻辑 secondClass.setMyCustomEventListener(args -> { System.out.println("收到自定义事件:" + args.getMessage() + ",状态码:" + args.getCode()); }); // 触发自定义事件 secondClass.triggerCustomEvent("由MyFirstClass触发的事件", 200); } }
Kotlin 实现方案
Kotlin可以用更简洁的高阶函数来实现,当然也支持接口方式,这里给出更常用的高阶函数版本:
首先是自定义事件参数类,用Kotlin的data class可以自动生成Getter等方法:
data class MyCustomEventArgs(val message: String, val code: Int)
然后是MySecondClass:
class MySecondClass { // 用高阶函数存储事件回调,相当于C#的EventHandler private var onCustomEvent: ((MyCustomEventArgs) -> Unit)? = null // 注册事件回调 fun setOnCustomEvent(listener: ((MyCustomEventArgs) -> Unit)?) { this.onCustomEvent = listener } // 触发事件,用安全调用避免空指针 fun triggerCustomEvent(message: String, code: Int) { onCustomEvent?.invoke(MyCustomEventArgs(message, code)) } }
MyFirstClass的调用逻辑:
class MyFirstClass { fun doActionAndTriggerEvent() { val secondClass = MySecondClass() // 注册事件回调 secondClass.setOnCustomEvent { args -> println("收到自定义事件:${args.message},状态码:${args.code}") } // 触发事件 secondClass.triggerCustomEvent("由MyFirstClass触发的事件", 200) } }
补充说明
如果需要支持多个监听器,只需要把单个监听器变量换成集合即可:
- Java中用
List<MyCustomEventListener>,注册时list.add(listener),触发时遍历集合调用每个监听器的方法 - Kotlin中用
MutableList<(MyCustomEventArgs) -> Unit>,注册时list.add(listener),触发时遍历调用listener.invoke(args)
内容的提问来源于stack exchange,提问作者delux
相关产品推荐
相关产品推荐

