Java/Android:将目标处理程序传递给将其作为弱引用引用的自定义按钮的最短方法(lambda?)

Java/Android:将目标处理程序传递给将其作为弱引用引用的自定义按钮的最短方法(lambda?),java,android,lambda,weak-references,generic-type-argument,Java,Android,Lambda,Weak References,Generic Type Argument,我在Android中创建了我的自定义按钮。以前,我只有一个非常简单的接口,可以将目标方法作为按钮的回调传递: public interface onTouchInterface { void onTouch(); } 当我想将回调传递给按钮时,我只使用lambda表达式: mybutton.addTarget(this::mycallback); 哪一条是你的捷径 mybutton.addTarget(new onTouchInterface() { @Override

我在Android中创建了我的自定义按钮。以前,我只有一个非常简单的接口,可以将目标方法作为按钮的回调传递:

public interface onTouchInterface {
    void onTouch(); 
}
当我想将回调传递给按钮时,我只使用lambda表达式:

mybutton.addTarget(this::mycallback); 
哪一条是你的捷径

mybutton.addTarget(new onTouchInterface() { 
    @Override 
    void onTouch() { this.mycallback() }
});
问题是,我意识到即使在我从任何地方删除了片段后,
这个
(在我的例子中通常是一个片段)仍然在内存中,而垃圾收集器应该删除它。我发现它被我的lambda表情“封住了”

我的问题是:如何在引用较弱的情况下生成最短的语法?目前,我创建了这个类,而不是我以前非常简单的接口:

public abstract static class Target<T>
{
    protected WeakReference<T> scope ;

    static protected class ScopeNotPresentException extends Exception {}

    protected Target(T scope) { this.scope = new WeakReference<T>(scope); }

    // this is the raw callback called by the button when user clicks
    // it throws an exception if the scope is null, otherwise it executes onTouch (to be overrided)
    final public void onTouchRawCallback() throws ScopeNotPresentException {
        if(scope.get() == null)
            throw new ScopeNotPresentException();
        else
            onTouch(scope.get());
    }

    // when this subclassed method is executed, the scope is verified to be not null
    protected void onTouch(T scope) { }

} 
因此,如果scope.get()为null,则会触发异常,并且不会调用
onTouch()
。最后,我的所有片段都会向按钮添加一个处理程序,如下所示:

mybutton.addTarget(new MyCustomButton.Target<MyFragment>(this) {
    @Override
    protected void onTouch(MyFragment scope) {
        scope.fragmentCustomClickHandler(); 
    }
});
mybutton.addTarget(新的MyCustomButton.Target(此){
@凌驾
受保护的void onTouch(MyFragment范围){
scope.fragmentCustomClickHandler();
}
});
但是这当然比
mybutton.addTarget(this::mycallback)要详细得多。我发现我不能将lambda用于参数传递给构造函数的泛型类型类

您是否有更好的实现方案,这样我就可以继续使用lambda短语法,同时使用弱引用安全地检索
?(例如,在swift中
addTarget({[weak self]self?.myCallback();})
如果self为null,则停止该操作)

当侦听器使
this
保持活动状态时,表示该按钮使侦听器保持活动状态,这表示该按钮仍处于活动状态。您不希望有一个按钮允许对目标片段进行垃圾收集,并在每次触摸时产生异常。当您认为按钮不应该处于活动状态时,您应该修复按钮的生命周期。当按钮应该处于活动状态,但不更新此特定片段时,您应该删除侦听器,而不是让它在每个事件上抛出异常。谢谢您的回答。你的意思是,如果我删除了片段,回调(由按钮和片段强烈保持)应该被垃圾收集,因为片段ref被删除,然后按钮ref被删除,然后没有对象再保持回调当侦听器保持
this
活动时,这意味着按钮保持侦听器活动,这意味着按钮仍处于活动状态。您不希望有一个按钮允许对目标片段进行垃圾收集,并在每次触摸时产生异常。当您认为按钮不应该处于活动状态时,您应该修复按钮的生命周期。当按钮应该处于活动状态,但不更新此特定片段时,您应该删除侦听器,而不是让它在每个事件上抛出异常。谢谢您的回答。你的意思是如果我删除了片段,回调(由按钮和片段强烈控制)应该被垃圾收集,因为片段ref被删除,然后按钮ref被删除,然后没有对象再控制回调
mybutton.addTarget(new MyCustomButton.Target<MyFragment>(this) {
    @Override
    protected void onTouch(MyFragment scope) {
        scope.fragmentCustomClickHandler(); 
    }
});