如何使用TypeToken将JSON转换回自定义ArrayList<Events>对象?
解决Gson反序列化ArrayList导致应用无响应的问题
排查Events类的序列化逻辑
重点检查是否存在循环引用:比如Events对象里的某个字段引用了包含自身的集合,或者对象内部存在互相引用的情况,这会让Gson在反序列化时陷入无限递归,直接卡死应用。另外,确认所有字段的类型都能被Gson自动解析,若有自定义复杂类型字段,需给Gson注册对应的TypeAdapter。验证存储的JSON字符串合法性
把SharedPreferences中存储的eventString打印出来,检查格式是否完整(无缺失括号、引号),同时确认数据大小未超过SharedPreferences单键值对的限制(约1MB)——如果集合过大,存储时可能已经出现数据截断,导致Gson解析时长时间无响应。务必在子线程执行反序列化
绝对不要在主线程运行这段解析代码!如果ArrayList数据量较大,Gson解析会占用大量CPU资源,直接阻塞主线程引发ANR(应用无响应)。将解析逻辑移到子线程(如AsyncTask、线程池、Coroutine),主线程仅负责后续UI更新操作。优化TypeToken写法(兼容部分Gson版本)
部分场景下,匿名内部类形式的TypeToken可能因类加载器问题导致类型识别异常,可尝试显式声明变量或调整写法:ArrayList<Events> events = gson.fromJson(eventString, new TypeToken<ArrayList<Events>>() {}.getType());增加异常捕获排查问题
给解析代码加上异常捕获,打印详细日志,定位隐藏的错误:try { Type eventType = new TypeToken<ArrayList<Events>>() {}.getType(); events = gson.fromJson(eventString, eventType); } catch (Exception e) { e.printStackTrace(); // 此处可添加异常处理逻辑,如清空数据、提示用户 } catch (Error e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者InFumumVerti
相关产品推荐
相关产品推荐

