【问题标题】:Define BroadcastReceiver.onReceive with a method reference使用方法参考定义 BroadcastReceiver.onReceive
【发布时间】:2016-11-25 08:51:25
【问题描述】:

使用 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 替换表达式。有什么建议可以解决这个问题?

【问题讨论】:

  • 您可以为扩展 BroadcastReceiver 的类创建构造函数,并将接口侦听器传递给该构造函数。在 onReceive 方法中调用监听器
  • 我几乎得出了同样的结论,只是我没有使用监听器。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    只是为了扩展上面的答案,没有 BiConsumer(API 中不可用

    class BroadcastReceiver extends android.content.BroadcastReceiver {
        public interface IBR {
            void onReceive(Context context, Intent intent);
        }
    
        private final IBR receiver;
    
        public BroadcastReceiver( IBR receiver ){
            this.receiver = receiver;
        }
    
        @Override
        public void onReceive(Context context, Intent intent) {
            receiver.onReceive(context, intent);
        }
    }
    

    那么,同上同下

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-09
      • 2014-03-17
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      相关资源
      最近更新 更多