升级Support Library 27.1.0后Fragment的onLoaderFinished返回已关闭游标致崩溃
解决Support Library 27.1.0中CursorLoader返回已关闭游标导致的崩溃问题
我刚踩过这个一模一样的坑!这绝对是Support Library 27.1.0引入的已知bug,Google在后续版本已经修复了这个CursorLoader游标生命周期管理的问题。给你几个可行的解决方案:
优先方案:升级Support Library版本
直接把Support Library升级到27.1.1及以上版本,或者干脆迁移到AndroidX(毕竟Support Library已经停止维护了),这样就能彻底解决问题,不用做额外的代码修改。临时方案:拷贝游标使用
如果暂时没法升级依赖,可以在onLoaderFinished方法里对返回的游标做一份拷贝,避免原游标被提前关闭导致的异常。记得用完拷贝的游标后手动关闭,防止内存泄漏。示例代码如下:
@Override public void onLoaderFinished(Loader<Cursor> loader, Cursor data) { // 复制一份游标,避免原游标被关闭后无法使用 Cursor copiedCursor = data.copy(data.getPosition(), data.getCount()); // 这里用copiedCursor处理你的数据逻辑 // 比如更新Adapter、读取数据等 // ... // 处理完后记得关闭拷贝的游标 copiedCursor.close(); }
- 备选临时方案:调整Fragment生命周期处理
检查你的Fragment中是否在onDestroyView或其他生命周期方法里有间接影响游标状态的逻辑,如果有的话暂时注释掉;另外在onLoaderReset里确保不要提前关闭游标,但这个方案的稳定性不如前两个。
附上你提供的崩溃堆栈信息:
03-27 16:27:58.653 18706 18706 E AndroidRuntime: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteQuery: ... 03-27 16:27:58.653 18706 18706 E...
内容的提问来源于stack exchange,提问作者blinkmacalahan
相关产品推荐
相关产品推荐

