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

使用Volley发起第二次网络请求时持续报Bad URL错误求助

解决Volley二次请求始终报"Bad URL"的问题

嘿,我帮你捋捋这个问题——你说不管传什么URL,Volley第二次请求都报VolleyError: java.lang.RuntimeException: Bad URL,这种情况几乎不可能是URL本身格式的问题,大概率是代码里的隐藏细节搞的鬼,我给你拆解下可能的原因和修复方案:

最常见的坑:URL里的隐藏不可见字符

看你提供的URL开头http://,这里很可能带有**零宽空格(U+200B)**或者其他不可见的Unicode控制字符——很多时候复制粘贴URL时会不小心带入这些字符,Volley的URL解析器会把它们当成非法字符,直接判定为Bad URL。

其他可能的原因

  • 复用了旧的Request对象:如果你的代码里第二次请求时用了之前已经执行过的StringRequest实例,Volley内部的状态会混乱,导致URL参数被篡改或者请求失效。
  • URL编码错误:你URL里的&是HTML转义后的字符,Volley需要的是原始的&作为参数分隔符,这也会导致解析失败。

具体修复步骤

1. 清理URL中的隐藏字符

先手动重新输入URL,或者用代码自动清理掉所有不可见控制字符:

// 移除URL中的所有不可见控制字符
String cleanUrl = yourOriginalUrl.replaceAll("\\p{C}", "");

然后用清理后的cleanUrl创建请求。

2. 每次请求都创建新的Request实例

绝对不要复用之前的StringRequest,每次发起请求都new一个全新的对象,同时把&改回&:

try {
    RequestQueue queue = Volley.newRequestQueue(getActivity());
    // 注意:每次请求都新建StringRequest,并且用原始的&分隔参数
    String cleanUrl = "http://27.67.80.6:18080/154.m3u8?AdaptiveType=HLS&VOD_RequestID=U6tIRX+QtmFBXhLTgqa7ueyBtmHx5QAI3mRpdZ2Q7ux7K53vZQMpmfIQhMqTkuSfjDtGu7YlgP0t/EorYPdiLw==";
    StringRequest sr = new StringRequest(Request.Method.GET, cleanUrl, 
        new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                // 处理你的响应逻辑
            }
        }, 
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                // 处理错误
            }
        });
    queue.add(sr);
} catch (Exception e) {
    e.printStackTrace();
}

3. 优化RequestQueue的管理(可选)

如果你的Activity频繁创建RequestQueue,建议把它做成单例,避免重复初始化导致的内存泄漏或状态异常:

public class VolleySingleton {
    private static VolleySingleton instance;
    private RequestQueue requestQueue;
    private static Context ctx;

    private VolleySingleton(Context context) {
        ctx = context;
        requestQueue = getRequestQueue();
    }

    public static synchronized VolleySingleton getInstance(Context context) {
        if (instance == null) {
            instance = new VolleySingleton(context);
        }
        return instance;
    }

    public RequestQueue getRequestQueue() {
        if (requestQueue == null) {
            // 使用ApplicationContext避免内存泄漏
            requestQueue = Volley.newRequestQueue(ctx.getApplicationContext());
        }
        return requestQueue;
    }

    public <T> void addToRequestQueue(Request<T> req) {
        getRequestQueue().add(req);
    }
}

之后在Activity里这样调用:

VolleySingleton.getInstance(getActivity()).addToRequestQueue(sr);

快速验证方法

你可以先把URL换成一个绝对没问题的地址(比如http://www.example.com),如果第二次请求还是报错,那肯定是复用Request对象的问题;如果简化后正常,那就是原URL里有隐藏字符或者编码问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:49:11