android - 在 Android 中创建注释常量以用作函数返回类型,类似于 Google Play Billing
问题描述
我的公司有一个 Android 应用程序(用 Kotlin 编写),我们目前正在向其添加应用内计费,以符合新规则。我们还有一个使用相同数据的 iOS 和 Web 应用程序,因此我们需要在后端验证所有购买,以检查所有三个平台。在实现 Google Play Billing 库时,我遇到了一些有趣的事情,但我似乎无法弄清楚到底发生了什么。
正如我刚才提到的,我们必须将所有购买发送到我们的服务器以验证购买并更新同步数据库。我正在使用 Retrofit、表示请求和响应的两个自定义数据类以及 Gson 转换器来执行此操作。推荐的结构如下:
fun handlePurchase(purchase: Purchase) {
if (purchase.purchaseState === PurchaseState.PURCHASED) {
if (!purchase.isAcknowledged) {
// Retrofit call in the viewModel
}
}
}
当我查看参考文档时,Purchase.PurchaseState 被列为注释。我以前从未见过在比较语句和购买中使用过的注释。purchaseState实际上返回一个 int。当我在 Android Studio 中查看反编译的类文件时,收到如下 Java 代码:
@Retention(RetentionPolicy.SOURCE)
public @interface PurchaseState {
int UNSPECIFIED_STATE = 0;
int PURCHASED = 1;
int PENDING = 2;
}
做一些挖掘让我找到了Typedef annotations。这对我来说是新的,所以我尝试使用我们的自定义响应类来查看是否可以让注释以与 Purchase.PurchaseState 相同的方式工作,即我可以在比较语句中使用它来显示正确的消息一旦我收到来自服务器的响应:
viewModel.response.observe(this, {
Log.i(TAG,"Acked: ${it.acknowledged}. Code: ${it.responseCode}")
if(it.responseCode == AcknowledgementResponse.ResponseCode.OK) {
Log.i(TAG, "Success")
}
})
我能得到的最接近的是以下定义,它允许我访问内部注释但不提供对值的访问:
data class AcknowledgementResponse(val acknowledged: Boolean, @ResponseCode val responseCode: Int) {
@Retention(AnnotationRetention.SOURCE)
@IntDef(OK, ALREADY_EXISTS, INVALID_PURCHASE, INVALID_TOKEN, ACKNOWLEDGEMENT_ERROR)
annotation class ResponseCode
companion object {
const val OK = 1;
const val ALREADY_EXISTS = 2;
const val INVALID_PURCHASE = 3;
const val INVALID_TOKEN = 4;
const val ACKNOWLEDGEMENT_ERROR = 5;
}
}
我目前的假设是问题源于注释、常量或两者的错误放置。任何指导和/或建议都会有所帮助!
解决方案
推荐阅读
- mysql - Nested select MAX() of another table when data doesn't exist
- ruby-on-rails - 有没有办法使用工作的“rails c”控制台查看视图?
- c# - 由于异常而扰乱函数调用顺序
- python - 找到离点最近的多边形的快速方法
- ms-word - 当 Word 2010 出现“未指定错误”时,会显示部件和行号。如何在 Word 2019 中显示此信息?
- java - 如何从抽象类中实现的方法中获取类
- django - 姜戈。在多个模型中搜索
- django - 如何使用 Select2 和 Formset 创建 django 列表?
- regex - install() 与 FILES_MATCHING PATTERN 忽略模式并安装所有
- java - DaggerTestApplicationComponent 未生成缺少绑定...对此不确定