【问题标题】:What does an "asynchronous method" mean in Java?Java中的“异步方法”是什么意思?
【发布时间】:2016-07-11 20:02:08
【问题描述】:

我正在处理一个应用的 android 计费示例。示例应用程序引用了一个异步方法。我在网上看了看,我似乎找不到一个好的定义,请有人帮忙举个例子。 示例如下:

 // Start setup. This is asynchronous and the specified listener
 // will be called once setup completes.

    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
    public void onIabSetupFinished(IabResult result) {

是不是立即返回结果的方法?

【问题讨论】:

  • 这基本上意味着该方法将在单独的线程上执行,并且不会阻塞调用startSetup的线程。它是异步的,因为既没有依赖关系也没有能力准确控制何时执行。

标签: java anonymous-inner-class


【解决方案1】:

如果我没记错的话,您指的是这种方法 startSetup 接受 final OnIabSetupFinishedListener 并据称设置了帐单。

您似乎感到困惑的是,Java 的这个在语法上相当晦涩的特性称为匿名内部类

让我尝试回答您的问题以使其更容易:

是不是立即返回结果的方法?

是的,有点(它当然不会返回任何东西,因为它是一个void 方法)。简单来说,它是一个接受接口 OnIabSetupFinishedListener 的实例的方法,并按照 Javadoc 中的说明异步完成它的一些工作,并且不返回任何内容:

这将异步启动设置过程。

因此,此方法类似于任何其他void Java 方法。唯一的附加实现信息是在您传递给此方法的listener 和其他一些对象之间建立了某种通信。

但是这种通信将在稍后的某个时间点发生,不是 在您调用此方法时startSetup .因此,重要的是 调用站点,即您将如何在自己的应用程序中调用此方法。希望这发生在设置您的应用程序时,您需要让它快速运行,因此此方法提供 callback 机制并以同步方式尽快返回,而不会造成不必要的延迟。这意味着您的调用线程可以取得进展,并且当适当的事件发生时,您传递给此方法的侦听器可以在稍后的某个其他线程中使用。

混淆的部分原因还在于匿名内部类的典型编码方式。因此,您的呼叫站点可能看起来像following

mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
   public void onIabSetupFinished(IabResult result) {
      if (!result.isSuccess()) {
         // Oh noes, there was a problem.
         Log.d(TAG, "Problem setting up In-app Billing: " + result);
      }
         // Hooray, IAB is fully set up!
   }
});

在这里,您直接在调用站点提供接口OnIabSetupFinishedListener 的匿名实现(实际上没有创建一个单独的类来实现该接口,使用类似class MyListener implements OnIabSetupFinishedListener 的结构)。

【讨论】:

    【解决方案2】:

    是的。在这种情况下,“异步”意味着方法将立即返回,并继续执行方法调用之后的语句。稍后,将在侦听器上调用onIabSetupFinished(...) 方法。这称为回调。异步回调的一个重要考虑因素是它们在哪个线程中被调用。您需要参考此 API 的文档来了解这一点。

    【讨论】:

      【解决方案3】:

      异步方法不是典型的请求/响应 你可以把它想象成一个承诺,或者不经过池化就可以回复的东西。 在您的情况下,您正在创建一个匿名侦听器,它将在这里解决承诺

      public void onIabSetupFinished(IabResult result){
       //you will eventually get the response here
      }
      

      【讨论】:

        猜你喜欢
        • 2011-03-24
        • 1970-01-01
        • 1970-01-01
        • 2011-12-12
        • 1970-01-01
        • 2013-04-11
        • 1970-01-01
        • 2013-11-26
        • 1970-01-01
        相关资源
        最近更新 更多