如果我没记错的话,您指的是这种方法 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 的结构)。