当前位置: 首页 > 面试题库 >

这是使用接口回调的正确方法吗?

洪楚
2023-03-14
问题内容

我读这个和这个,结果发现,在课堂上B我需要保存到类的引用A,当东西在发生类B,我们执行由类的接口中定义的方法A工具。好吧,我明白了。我以不同的方式使用接口来调用回调:

interface IHelper {
    void onActionDone ();
    void onActionFailed ();
}

public class Helper implements IHelper {

    public Helper (Param param) {
        // here we do what Helper class intended to do
        // ...
        // now call the any of callbacks
        if(everything == OK) {
            onActionDone();
        } else {
            onActionFailed();
        }
    }

    @Override
    public void onActionDone() {}

    @Override
    public void onActionFailed() {}
}

public class MainClass () {
    new Helper(message) {
        public void onActionDone () {
            // here we can do anything we want after Helper will done its functions
        }
        public void onActionFailed () {
            // or not done
        }
    }
}

我发现这种方式更具可读性,更容易理解,但是不确定这是否是不好的做法。因此,我可以随意走这条路吗?


问题答案:

所以我可以随意走这条路吗?

这种方式不是很正确。

您在说的是称为Observer或Subscriber/ Publisher模式。

简而言之:订户想要从发布者接收事件(杂志问题),因此他将发布事件通知(订阅)。之后,发布者将发生的事件通知订阅者。

在您的代码段中,发布者为Helper,订阅者为MainClass。发布者具有一种订阅形式IHelper

public class Helper {
    IHelper mSubscriber;
    ...
    void setSubscriber(IHelper subscriber) {
        this.mSubscriber = subscriber;
    }
    ...
}

订阅者应填写表格,即implements IHelper,并将其自身通知发布者:

public class MainClass implements IHelper {
    Helper mPublisher;
    ...
    void someMethod() {
        mPublisher.setSubscriber(this);
    }
    ...
}

现在,当发行人发行新杂志时,订户将收到有关以下内容的通知:

public class Helper {
    ...
    void newMagazineIssued() {
        mSubscriber.onActionDone();
    }

    void newMagazineFailed() {
        mSubscriber.onActionFailed();
    }
    ...
}

一个侦听器示例:

如果上述说法让您有些困惑,请考虑Button您刚刚在中初始化了一个Activity。该按钮充当发布者,而Activity充当订阅者。该Activity希望因此订阅与事件当按钮被用户(发布新杂志)单击通知,setOnClickListener()View.OnClickListener传递给方法的参数是认购表格。的Activity(订户)填充的形式,通过实现接口和重写onClick()方法,并传递的形式向法(订阅)。发生点击时,Activity系统会通知。



 类似资料:
  • 我读了这篇文章和这篇文章,发现在类中,我需要保存对类的引用,当类中发生一些事情时,我们执行一个由类实现的接口定义的方法。不知何故我明白了。我以不同的方式使用接口来调用回调: 我发现这种方式更易读,更容易理解,但不确定这是否是一个不好的做法。所以我可以自由地走得更远吗?

  • 问题内容: 我能够使用三个链接来组合一个简化的完整History.js示例,以从整个页面加载内容片段,而无需更新页面和更新浏览器历史记录。 这是相关的代码段- 完整的工作示例在此处http://jsfiddle.net/PT7qx/show 我想知道这是否正确。以前的版本可以使用#url绑定到事件。我没有看到使用此最新版本将事件绑定到url的任何示例,因此我使用了.on()click事件来调用Hi

  • 关于SpringWebFlux的小问题,以及如何“链接”http调用。 通过一个具体的例子,这里是一个非常简单的SpringMVC示例,带有一个rest模板。 在这个片段中,我们看到了非常简单的内容。仅初始化一个rest模板。 超文本传输协议请求有效载荷对象的构造。 使用所构建的对象来查询第一外部web应用API以获得响应。 重要的是,需要第一个HTTP调用的响应来进行第二个HTTP调用。它们只能

  • 问题内容: 我知道我不应该改变输入,而应该克隆对象来改变它。我遵循在redux入门项目上使用的约定,该约定使用: 用于添加项目-我使用了点差将项目追加到数组中。 用于删除我使用的: 但这改变了输入状态对象-即使我要返回一个新对象,也禁止这样做吗? 问题答案: 不,永远不要改变你的状态。 即使您要返回一个新对象,您仍然会污染旧对象,而您从来不希望这样做。这使得在旧状态与新状态之间进行比较时会出现问题

  • 我创建了一个接口,以便可以在对话和片段之间进行通信。 目标:当用户从对话框中选择任何内容时,应将其显示在文本视图中。 在这个界面中,我创建了一个界面方法,在主活动中调用,并传递用户在对话框中选择的值。与用户选择的值一起,在我的片段中,我创建了一个方法,将文本视图设置为该值。然而,每当我调用该方法时,它总是返回null。 我对日志进行了大量测试,发现通过我的方法传递的值不是空的,一切似乎都按照我想要