集成Google Play BillingClient初始化出现NullPointerException空指针异常如何解决?
崩溃原因
从错误栈可以看到
BillingClient的构建逻辑是在CoinsHistoryActivity类实例化阶段(<init>回调)执行,此时Android系统还未完成Activity的Context绑定流程,你传入的Activity实例对应的上下文是空值,BillingClient内部调用getApplicationContext()时触发空指针异常。
附带的Firebase Crashlytics超时异常是崩溃发生后的衍生问题,是上报逻辑在主线程等待超时导致的,修复主崩溃后该问题会同步消失。
修复方案
- 先将BillingClient改为仅声明不初始化的成员变量,不要在类构造/成员变量赋值阶段执行构建逻辑
- 将初始化逻辑迁移到Activity的
onCreate()生命周期方法中执行,此时Activity的Context已经初始化完成,可以安全传入 - 初始化完成后再调用
billingClient.startConnection()建立和Google支付服务的连接
正确代码示例
成员变量声明
// 仅声明,不执行初始化 private BillingClient billingClient; // 购买回调自行实现对应逻辑 private PurchasesUpdatedListener purchasesUpdatedListener = (billingResult, purchases) -> { // 处理购买结果 };
onCreate生命周期初始化
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_coins_history); // 上下文就绪后再初始化BillingClient billingClient = BillingClient.newBuilder(this) .setListener(purchasesUpdatedListener) .enablePendingPurchases() .build(); // 后续建立支付服务连接 billingClient.startConnection(new BillingClientStateListener() { @Override public void onBillingSetupFinished(BillingResult billingResult) { if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { // 连接成功,可以查询商品、发起购买 } } @Override public void onBillingServiceDisconnected() { // 连接断开可尝试重连 } }); }
注意事项
- 所有依赖Android Context的初始化逻辑都不要放在Activity类的构造阶段、成员变量赋值阶段执行,必须放到
onCreate及之后的生命周期回调中 - 如果在Fragment中初始化BillingClient,使用
requireActivity()作为上下文参数,不要使用未绑定的弱引用/空activity变量 - 页面销毁时记得调用
billingClient.endConnection()关闭连接,避免内存泄漏
内容的提问来源于stack exchange,提问作者Anuj Vaish
相关产品推荐
相关产品推荐

