如何修复java.lang.IllegalStateException: Already executed.(PID:7664)错误?
解决
java.lang.IllegalStateException: Already executed.错误 这个错误核心原因是同一个可执行任务对象被重复调用执行方法,最常见于OkHttp请求场景,以下是具体解决方案:
检查请求对象复用问题
若使用OkHttp发起登录请求,Call对象是一次性的,执行后无法再次调用execute()或enqueue()。要避免复用同一个Call实例,每次发起登录请求都创建新的Call对象:// 错误示例:复用同一Call实例 OkHttpClient client = new OkHttpClient(); Request loginRequest = new Request.Builder().url("登录接口地址").build(); Call loginCall = client.newCall(loginRequest); // 多次点击登录按钮重复调用会报错 loginBtn.setOnClickListener(v -> { loginCall.enqueue(new Callback() { ... }); }); // 正确示例:每次请求创建新Call loginBtn.setOnClickListener(v -> { Request newLoginRequest = new Request.Builder().url("登录接口地址").build(); Call newLoginCall = client.newCall(newLoginRequest); newLoginCall.enqueue(new Callback() { ... }); });增加按钮防重复点击逻辑
用户快速多次点击登录按钮会触发重复请求,可在点击后立即禁用按钮,请求完成(成功/失败)后再恢复:loginBtn.setOnClickListener(v -> { loginBtn.setEnabled(false); // 发起登录请求 Call newLoginCall = client.newCall(newLoginRequest); newLoginCall.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { runOnUiThread(() -> loginBtn.setEnabled(true)); // 处理登录成功逻辑 } @Override public void onFailure(Call call, IOException e) { runOnUiThread(() -> loginBtn.setEnabled(true)); // 处理登录失败逻辑 } }); });排查其他异步框架问题
若使用AsyncTask、RxJava等其他异步框架,检查是否存在重复订阅/执行同一任务实例的情况,确保每次执行都创建新的任务实例。清理环境缓存
重启模拟器和Android Studio,清理项目缓存(File → Invalidate Caches...),排除环境缓存导致的异常。
内容的提问来源于stack exchange,提问作者Nguyễn Khánh Tôn
相关产品推荐
相关产品推荐

