java - 使用方法引用定义 BroadcastReceiver.onReceive

标签 java android lambda java-8 android-7.0-nougat

使用 Jack 对 Java 8 的支持,我希望能够编写类似的内容:

public void onReceive(Context context, Intent intent) {
    if (!intent.getAction().equals(ACTION_BINGO)) return;
    Log.d(TAG, "Bingo!");
}

... 

registerReceiver(this::onReceive, INTENT_FILTER_BINGO);

不幸的是,这是不可能的。虽然 onReceive()BroadcastReceiver 特有的抽象方法,但那东西不是一个接口(interface),而是一个抽象类>,它似乎无法被 lambda 表达式替换。有什么建议可以解决这个问题吗?

最佳答案

使用this answer中概述的技巧,这是我得到的:

public class BroadcastReceiver extends android.content.BroadcastReceiver {

    private final BiConsumer<Context, Intent> receiver;

    public BroadcastReceiver(final BiConsumer<Context, Intent> onReceive) {
        receiver = onReceive;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        if (receiver == null) {
            throw new UnsupportedOperationException("Not yet implemented");
        }
        receiver.accept(context, intent);
    }
}

不像我预期的那么简洁,但更好:

BroadcastReceiver receiver = new BroadcastReceiver(this::onReceive);
registerReceiver(receiver, INTENT_FILTER_BINGO);

关于java - 使用方法引用定义 BroadcastReceiver.onReceive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40800926/

相关文章:

java - Eclipse - 查找所有扩展接口(interface)的类

java - GWT DialogBox 生成其自身的多个副本

Java的ExecutorService性能

android - 谷歌通知上的一些代码中的 "mId"(未知的外星人变量)是什么,这是一个谜

c# - 与 android xamarin 中的命名空间混淆

c++ - 将 lambda 表达式传递给模板函数时出现编译错误

java - 不同的时间间隔 util.date 和 DAYS.between(Localtime)

Android - 在布局 XML 中使用自定义 SurfaceView

c++ - 在 C++0x 中模拟 finally block

c++ - 不返回 lambda 奇怪的行为