使用方法引用定义BroadcastReceiver.onReceive

问题描述 投票:0回答:2

使用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的独特抽象方法,但该东西不是一个接口,它是一个抽象类,看起来似乎不能被lambda表达式替换。有什么建议可以解决这个问题吗?

java android lambda java-8 android-7.0-nougat
2个回答
2
投票

使用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);

1
投票

只是为了扩展上面的答案,没有BiConsumer(不适用于API <24)

interface IBR {
    void onReceive(Context context, Intent intent);
}

class BroadcastReceiver extends android.content.BroadcastReceiver {
    private final IBR receiver;

    public BroadcastReceiver( IBR receiver ){
        this.receiver = receiver;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        receiver.onReceive(context, intent);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.