2014-12-15 23 views
14

Hôm nay tôi phát hiện ra một báo cáo tai nạn ứng dụng cho các ứng dụng Android của tôi liên quan đến stack trace sau:NullPointerException trong IabHelper.queryPurchases

java.lang.NullPointerException: Attempt to invoke interface method 'android.os.Bundle com.android.vending.billing.IInAppBillingService.getPurchases(int, java.lang.String, java.lang.String, java.lang.String)' on a null object reference 
at com.myapp.utils.IabHelper.queryPurchases(IabHelper.java:878) 
at com.myapp.utils.IabHelper.queryInventory(IabHelper.java:572) 
at com.myapp.utils.IabHelper.queryInventory(IabHelper.java:545) 
at com.myapp.utils.IabHelper$2.run(IabHelper.java:645) 
at java.lang.Thread.run(Thread.java:818) 

(số dòng được thay đổi từ bản gốc -Hoặc gì looks like to be the original, vì format tùy chỉnh)

Thông thường, một người sẽ sửa đổi mã của riêng mình để kiểm tra các thành viên chưa được chỉ định của lớp học. Vấn đề là mã này được sao chép & dán ngay từ Android SDK, vì IabHelper là một lớp học mà Android SDK provides như là một điểm khởi đầu tốt cho việc thực hiện trong ứng dụng v3 Thanh toán

Dòng tội là lần thứ hai

logDebug("Calling getPurchases with continuation token: " + continueToken); 
Bundle ownedItems = mService.getPurchases(3, mContext.getPackageName(), itemType, continueToken); 

Dường như dịch vụ không được kết nối tại thời điểm phương thức được gọi. Lỗi này xảy ra trên thiết bị Nexus 5 (theo Bảng điều khiển dành cho nhà phát triển)

  • Đây có phải là sự cố đã biết với Android 5 không?
  • Có phiên bản cập nhật của Trình trợ giúp IAB không?
  • Tôi có thể làm gì hơn là chỉnh sửa thủ công mã để xử lý NPE một cách nào đó?
+0

IabHelper hiện đã lỗi thời và không còn được sử dụng nữa. Google đã phát hành thư viện BillingClient: https://developer.android.com/google/play/billing/billing_library.html – DSchmidt

+0

Câu hỏi thực tế là rất cũ –

+1

Câu hỏi này vẫn được xếp hạng rất cao trên Google. Tôi tình cờ gặp lỗi và phát hiện ra họ đã phát hành thư viện mới cách đây vài tuần. Đây chỉ là một lưu ý cho tất cả các nhà phát triển khác sắp tới. – DSchmidt

Trả lời

21

tôi đổi mã này ...

do { 
     logDebug("Calling getPurchases with continuation token: " + continueToken); 
     Bundle ownedItems = mService.getPurchases(3, mContext.getPackageName(), itemType, continueToken); 
     // ... 
    } 

Để có này ...

do { 
     logDebug("Calling getPurchases with continuation token: " + continueToken); 
     if (mService == null || mContext == null) { 
      logError("Our service and/or our context are null. Exiting."); 
      return IABHELPER_UNKNOWN_ERROR; 
     } 
     Bundle ownedItems = mService.getPurchases(3, mContext.getPackageName(), itemType, continueToken); 
     // ... 
    } 

Đây là gần như chắc chắn bởi vì quá trình này đang được chạy không đồng bộ và các hoạt động/ứng dụng có (hoặc đang được) đóng khi kết quả trả về.

+0

Hợp lý: khi Hoạt động bị tạm dừng, tôi không biết điều gì xảy ra với Looper. Dù sao bối cảnh mùa xuân là chủ sở hữu của cá thể IabHelper của tôi, do đó, nó là kinda khó khăn mà nó kỳ diệu trở thành null. --Mistery –

+6

Chỉ phát hiện ra rằng điều này xảy ra trong trường hợp này: mở ứng dụng của bạn. Giảm thiểu nó và mở PlayStore. Nhấp vào nút thiết bị hiển thị tất cả các tác vụ đang mở. Vuốt đi/giết nhiệm vụ PlayStore. Nhấp vào ứng dụng của bạn khi trên màn hình hiển thị tất cả các tác vụ đang mở. Bạn giải pháp ngăn chặn NullException này vì vậy cảm ơn rất nhiều. –

Các vấn đề liên quan