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

AsyncTask无法执行并抛出java.lang.VerifyError问题求助

解决AsyncTask引发的VerifyError问题

首先看你遇到的java.lang.VerifyError,这个错误一般是字节码不符合虚拟机验证规则导致的,结合你的代码和报错信息,我们可以从这几个方向排查解决:

1. 修复低级拼写错误

你的代码里onPostExecute方法的父类调用写错了:

@Override protected void onPostExecute(String s) { super.onPostExcute(); }

这里super.onPostExcute()少了字母c,正确写法是super.onPostExecute(s);。错误的方法签名会让虚拟机认为类的结构存在异常,这是最容易忽略的触发点。

2. 调整内部类的定义方式

从报错的类名MainActivity$100000000$GetJSON来看,这个奇怪的$100000000后缀大概率是编译或混淆时的异常结果。建议把嵌套在方法内的GetJSON改成外部类的静态内部类,避免非静态内部类持有外部类引用带来的潜在问题,同时让类结构更清晰:

修正后的完整代码示例:

private void getJSON(final String urlWebService) {
    new GetJSON(urlWebService).execute();
}

// 改为静态内部类,避免持有外部类引用
private static class GetJSON extends AsyncTask<Void, Void, String> {
    private final String mRequestUrl;

    // 通过构造方法传递URL,避免依赖外部类变量
    public GetJSON(String url) {
        mRequestUrl = url;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // 这里可以添加预处理逻辑,比如显示加载弹窗
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        // 在这里处理返回的JSON字符串,比如解析后更新UI
    }

    @Override
    protected String doInBackground(Void... voids) {
        try {
            URL url = new URL(mRequestUrl);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            StringBuilder sb = new StringBuilder();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream()));
            
            String jsonLine;
            while ((jsonLine = bufferedReader.readLine()) != null) {
                sb.append(jsonLine);
            }
            
            // 记得关闭流和连接,避免资源泄漏
            bufferedReader.close();
            con.disconnect();
            
            return sb.toString().trim();
        } catch (Exception e) {
            Log.i("BG Exception", e.getMessage() != null ? e.getMessage() : "Unknown network error");
            return "";
        }
    }
}

3. 检查混淆规则(若开启了混淆)

如果你的项目启用了ProGuard混淆,需要确保AsyncTask相关类没有被错误混淆。可以在混淆规则文件中添加以下配置:

-keep class android.os.AsyncTask { *; }
-keepclassmembers class ** extends android.os.AsyncTask {
    <init>(...);
}

报错里的奇怪类后缀,很大概率是混淆时破坏了类结构导致的。

4. 考虑替代方案(可选)

另外要注意,AsyncTask在Android 11(API 30)已经被官方废弃,推荐使用Coroutines、OkHttp配合ViewModel/LiveData来实现网络请求,这样更符合现代Android开发规范,还能避免AsyncTask容易引发的内存泄漏问题。

比如用Coroutines实现的简化版本:

private void getJSON(final String urlWebService) {
    CoroutineScope(Dispatchers.IO).launch {
        try {
            URL url = new URL(urlWebService);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            StringBuilder sb = new StringBuilder();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream()));
            
            String jsonLine;
            while ((jsonLine = bufferedReader.readLine()) != null) {
                sb.append(jsonLine);
            }
            
            bufferedReader.close();
            con.disconnect();
            final String response = sb.toString().trim();
            
            // 切换到主线程处理结果、更新UI
            withContext(Dispatchers.Main) {
                // 在这里解析和使用JSON数据
            }
        } catch (Exception e) {
            Log.i("BG Exception", e.getMessage() != null ? e.getMessage() : "Unknown network error");
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:40:46