You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:45:29