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

如何解决WorkManager传递超10240字节数据时抛出的java.lang.IllegalStateException异常?

解决WorkManager传递大JSON数据超过10240字节限制的问题

你遇到的这个IllegalStateException确实是WorkManager的Data类的硬限制——序列化后的数据不能超过10240字节,针对你这种用户动态生成的JSON数据场景,我推荐几个高效的解决思路:

方案一:将JSON写入本地私有文件,传递文件路径

这是最直接的方式,因为动态生成的JSON本质是文本,完全可以写入App的私有存储目录,然后只给Worker传递文件路径,Worker读取后再处理。

写入文件的示例代码:

// 在调用Worker的地方写入JSON
String jsonData = gson.toJson(myList);
File filesDir = getApplicationContext().getFilesDir();
File jsonFile = new File(filesDir, "temp_sync_data.json");

try (FileWriter writer = new FileWriter(jsonFile)) {
    writer.write(jsonData);
} catch (IOException e) {
    e.printStackTrace();
    // 处理写入失败的情况
}

// 构建WorkManager的Data,仅传递文件路径
Data.Builder data = new Data.Builder();
data.putString("json_file_path", jsonFile.getAbsolutePath());

OneTimeWorkRequest syncWorkRequest = new OneTimeWorkRequest.Builder(SendBluk.class)
    .addTag("Sync")
    .setInputData(data.build())
    .build();

Worker中读取文件的代码:

public class SendBluk extends Worker {
    public SendBluk(@NonNull Context context, @NonNull WorkerParameters params) {
        super(context, params);
    }

    @NonNull
    @Override
    public Result doWork() {
        String filePath = getInputData().getString("json_file_path");
        if (filePath == null) {
            return Result.failure();
        }

        File jsonFile = new File(filePath);
        StringBuilder jsonBuilder = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(new FileReader(jsonFile))) {
            String line;
            while ((line = reader.readLine()) != null) {
                jsonBuilder.append(line);
            }
            String jsonData = jsonBuilder.toString();
            // 在这里处理你的JSON数据
            myList = gson.fromJson(jsonData, new TypeToken<List<YourModel>>(){}.getType());
            
            // 处理完成后记得删除临时文件,避免占用存储
            jsonFile.delete();
        } catch (IOException e) {
            e.printStackTrace();
            return Result.failure();
        }

        return Result.success();
    }
}

方案二:用Room数据库临时存储数据

如果你的项目已经在用Room数据库,可以专门建一张临时表来存放待处理的JSON数据,给Worker传递数据的主键ID,Worker查询到数据后处理,处理完成后再删除这条临时记录。

临时表实体类示例:

@Entity(tableName = "temp_sync_data")
public class TempSyncData {
    @PrimaryKey(autoGenerate = true)
    public long id;
    public String jsonData;
}

调用Worker时的代码:

// 插入临时数据到Room
TempSyncData tempData = new TempSyncData();
tempData.jsonData = gson.toJson(myList);
long dataId = tempSyncDao.insert(tempData);

// 传递ID给Worker
Data.Builder data = new Data.Builder();
data.putLong("temp_data_id", dataId);

OneTimeWorkRequest syncWorkRequest = new OneTimeWorkRequest.Builder(SendBluk.class)
    .addTag("Sync")
    .setInputData(data.build())
    .build();

Worker中的处理代码:

public class SendBluk extends Worker {
    private TempSyncDao tempSyncDao;

    public SendBluk(@NonNull Context context, @NonNull WorkerParameters params) {
        super(context, params);
        // 初始化Room实例
        AppDatabase db = AppDatabase.getInstance(context);
        tempSyncDao = db.tempSyncDao();
    }

    @NonNull
    @Override
    public Result doWork() {
        long dataId = getInputData().getLong("temp_data_id", -1);
        if (dataId == -1) {
            return Result.failure();
        }

        TempSyncData tempData = tempSyncDao.getById(dataId);
        if (tempData == null) {
            return Result.failure();
        }

        // 处理JSON数据
        myList = gson.fromJson(tempData.jsonData, new TypeToken<List<YourModel>>(){}.getType());
        
        // 处理完成后删除临时数据
        tempSyncDao.delete(tempData);

        return Result.success();
    }
}

方案三:优化JSON数据体积(适合接近限制的场景)

如果你的JSON只是稍微超过限制,可以尝试压缩数据体积:

  • 使用Gson的GsonBuilder配置,关闭格式化输出(默认格式化会增加大量空格换行):
    Gson gson = new GsonBuilder().disableHtmlEscaping().create();
    String compactJson = gson.toJson(myList);
    
  • 移除JSON中不必要的字段,只保留Worker需要处理的内容,减少数据量;
  • 考虑用更紧凑的序列化格式(比如Protobuf)代替JSON,序列化后的体积会小很多,但需要额外定义proto文件,适合长期维护的项目。

内容的提问来源于stack exchange,提问作者Prasath S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 13:37:40