【问题标题】:What the purpose of doing (MyJobject as ILocalObject).GetObjectID这样做的目的是什么(MyJobject as ILocalObject).GetObjectID
【发布时间】:2018-10-04 11:26:52
【问题描述】:

在 delphi Tokyo 源代码中,我看到了这两种不同的方式来检索 “服务管理器”

var FLocationManager: JLocationManager;
FLocationManager := TJLocationManager.Wrap(TAndroidHelper.Context.getSystemService(TJContext.JavaClass.LOCATION_SERVICE));

和:

var FNotificationManager: JNotificationManager;
var NotificationServiceNative: JObject;
NotificationServiceNative := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.NOTIFICATION_SERVICE);
FNotificationManager := TJNotificationManager.Wrap((NotificationServiceNative as ILocalObject).GetObjectID);

这两种方式到底有什么区别?为什么在第二种情况下他们这样做 (NotificationServiceNative as ILocalObject).GetObjectID 而不是在第一种情况下?

【问题讨论】:

  • 我认为第一个是错误的。在我自己的代码中,它看起来像这样:LocationManagerService := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.LOCATION_SERVICE); FLocationManager := TJLocationManager.Wrap((LocationManagerService as ILocalObject).GetObjectID);
  • 是的,但在 delphi 源代码中,他们编写了 FLocationManager := TJLocationManager.Wrap(TAndroidHelper.Context.getSystemService(TJContext.JavaClass.LOCATION_SERVICE));在 System.Android.Sensors.pas
  • @lok​​i 不会是 Delphi 源代码第一次以错误的方式访问 Android 对象
  • @RemyLebeau 我同意,但是 System.Android.Sensors.pas 是每个人都非常使用的单位,那么它是如何工作的?没有错误报告
  • @lok​​i 实际上不,这不是错误。 Wrap() 有 2 个重载,一个用于对象引用,一个用于对象 ID。这就是为什么这两个例子都有效的原因

标签: delphi firemonkey


【解决方案1】:

将 Java 对象引用转换为 ILocalObject 并提取其 ObjectID 是使用 Wrap() 将对象引用转换为另一种对象类型的正确方法。

然而,更短的方式可以工作,因为Wrap() 有一个重载,它将Java 对象引用作为输入并在内部调用GetObjectID,然后Wrap() 就是这样。

所以,回答您的问题 - 没有真正的区别。两种方式都有效。

较长的代码可能只是从旧版本的 Delphi 遗留下来的?我不记得Wrap() 过载是否一直存在。当然,在 Delphi 支持 Android 的早期,您总是必须手动获取ObjectIDWrap() 重载可能是后来添加的,也许并非所有 FMX 代码都利用它。

【讨论】:

    猜你喜欢
    • 2020-11-16
    • 2012-01-08
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多