Android Java:如何将函数作为参数传入runOnUiThread执行?
在Java中优雅地传递UI线程执行的函数参数
这个需求在Java 8及以上版本里用函数式编程特性就能很优雅地解决,完全不用绕弯路~我给你拆解两种方案,优先推荐第一种,更安全高效:
方案一:利用Runnable与方法引用(最推荐)
因为你要执行的都是无返回值的方法,正好符合Runnable接口的签名(无参数、无返回值)。我们可以直接让runOnActivity接收Runnable参数,调用时用方法引用就能直接传递目标方法:
定义工具方法
// 直接接收Runnable,内部转发给runOnUiThread public void runOnActivity(Runnable uiTask) { mActivity.runOnUiThread(uiTask); }
调用方式
如果reload()是mContext的方法,直接用方法引用传递,编译期就能检查方法是否存在,完全避免拼写错误:
public void reload() { // 方法引用:mContext::reload 等价于 () -> mContext.reload() runOnActivity(mContext::reload); }
如果需要在UI线程执行多个操作,也可以用Lambda表达式扩展:
runOnActivity(() -> { mContext.reload(); mContext.updateUI(); // 可以添加其他UI操作 });
方案二:通过反射调用(不推荐,仅作参考)
你提到的通过传递方法名字符串的方式,需要用Java反射实现,但这种方式有明显缺点:编译期无法校验方法名是否正确,运行时才会报错;而且反射调用有性能开销,所以一般不推荐。不过还是给你写个示例:
定义工具方法
import java.lang.reflect.Method; public void runOnActivity(String methodName) { mActivity.runOnUiThread(() -> { try { // 通过反射获取mContext的目标方法 Method method = mContext.getClass().getMethod(methodName); // 调用方法 method.invoke(mContext); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { // 处理异常:比如方法不存在、权限不足等 e.printStackTrace(); } }); }
调用方式
public void reload() { runOnActivity("reload"); }
总结
优先选择方案一,利用Java 8的方法引用和Lambda,代码更简洁、安全,编译期就能排查错误;反射方式只适合特殊场景下的动态调用,日常开发尽量避免。
内容的提问来源于stack exchange,提问作者Amedeo
相关产品推荐
相关产品推荐

