调用官方提供的联系人jar获取方法在大量联系人存在的情况下(20K左右)报空指针异常
调用官方提供的联系人jar获取方法在大量联系人存在的情况下(20K左右)报空指针异常
示例代码:
plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, book => {
// 可通过addressbook进行通讯录操作
book.find(contactFields, list => {
const queryFinishTime = new Date().getTime();
const rst = dealData(list);
const now = new Date().getTime();
logger.info(`Query contact finish! count: ${rst.length}, ` +
`query cost: ${queryFinishTime - startTime}, ` +
`deal cost: ${now - queryFinishTime}ms, ` +
`total cost: ${now - startTime}ms`);
resolve(rst);
}, (e) => {
logger.error("Failed to get contacts:" + e.message);
resolve([]);
}, findOpts)
}, e => {
logger.error("Failed to get address book: " + e.message);
resolve([])
});
操作步骤:
- 前置条件:
- 调用代码示例中的获取联系人的方法
- 手机中联系人数量在20k左右
- 机型为: Samsung Galaxy S22 Ultra,Android 14
在上述条件下, 调用获取联系人, 发现非常慢; 而且出现了空指针异常
预期结果:
能够正常获取到联系人信息
实际结果:
APP崩溃, crash日志如下:
BOARD: msmnile
BOOTLOADER: G970USQS3CTA3
BRAND: samsung
CPU_ABI: arm64-v8a
CPU_ABI2:
DEVICE: beyond0q
DISPLAY: QP1A.190711.020.G970USQS3CTA3
FINGERPRINT: samsung/beyond0qltesq/beyond0q:10/QP1A.190711.020/G970USQS3CTA3:user/release-keys
HARDWARE: qcom
HOST: 21HH1G24
ID: QP1A.190711.020
IS_DEBUGGABLE: false
IS_EMULATOR: false
MANUFACTURER: samsung
MODEL: SM-G970U
PERMISSIONS_REVIEW_REQUIRED: true
PRODUCT: beyond0qltesq
RADIO: unknown
SERIAL: unknown
SUPPORTED_32_BIT_ABIS: [Ljava.lang.String;@c7611f8
SUPPORTED_64_BIT_ABIS: [Ljava.lang.String;@58f66d1
SUPPORTED_ABIS: [Ljava.lang.String;@608a536
TAGS: release-keys
TIME: 1579307533000
TYPE: user
UNKNOWN: unknown
USER: dpi
java.lang.NullPointerException: Attempt to invoke interface method 'int android.database.Cursor.getCount()' on a null object reference
at io.dcloud.feature.contacts.ContactAccessorImpl.populateContactArray(ContactAccessorImpl.java:209)
at io.dcloud.feature.contacts.ContactAccessorImpl.search(ContactAccessorImpl.java:175)
at io.dcloud.feature.contacts.JsContactsMgr.execute(JsContactsMgr.java:82)
at io.dcloud.feature.contacts.ContactsFeatureImpl$1.run(ContactsFeatureImpl.java:29)
bug描述:
调用官方的联系人sdk查询联系人, 报空指针异常; 目标手机联系人数量比较多, 大概20k左右; 接口效率很慢, 同时在报错;
1 回复
从错误日志来看,这是一个典型的Android联系人查询性能问题导致的空指针异常。当联系人数量过大(20K)时,系统Cursor查询可能超时返回null,而代码未做判空处理。
建议优化方案:
- 分批查询:使用findOpts参数设置offset和limit,分页获取联系人
let findOpts = {
offset: 0,
limit: 1000
}
-
减少查询字段:contactFields只包含必要字段
-
添加错误处理:
book.find(contactFields, list => {
if(!list) {
logger.error("Contacts data is null");
resolve([]);
return;
}
// 处理数据
}, ...)