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

Java中如何存储MySQL查询返回的字符串/字符串列表,解决异步取值为空问题

问题根因

核心问题是Volley网络请求的异步执行特性:getRowdata()方法只是把网络请求加入到Volley的请求队列就会立刻返回,不会等待网络请求、响应解析的完成。你调用完getRowdata()立刻执行getName()时,onResponse回调还没有触发,全局name变量还处于初始的null值,因此会拿到空值。
另外原代码中循环用的n_data未定义取值,建议替换为response.length()自动适配返回的数组长度,避免出现数据漏读或者下标越界问题。

解决方案:自定义回调接口处理异步结果

这是Android异步场景下的标准实现方案,不会阻塞主线程,逻辑也更清晰。

步骤1:定义回调接口

public interface OnDataFetchListener {
    // 请求成功时回调,返回解析完成的姓名列表
    void onSuccess(List<String> nameList);
    // 请求失败时回调,返回错误信息
    void onError(String errorMsg);
}

步骤2:修改DataBase类逻辑

public class DataBase  {
    private Context context;
    private RequestQueue requestQueue;

    // 补充构造方法初始化上下文和请求队列
    public DataBase(Context context) {
        this.context = context;
        this.requestQueue = Volley.newRequestQueue(context);
    }

    // 方法新增回调参数,用于返回结果
    public void getRowdata(OnDataFetchListener listener){
        String URL = "http://xxx.xxx.x.x/permisostemporales/getRowdata.php";
        JsonArrayRequest jsonArrayRequest=new JsonArrayRequest(URL, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                List<String> nameList = new ArrayList<>();
                try {
                    // 直接用返回数组的长度作为循环上限
                    for (int i = 0; i < response.length(); i++) {
                        JSONObject jsonObject = response.getJSONObject(i);
                        String name = jsonObject.getString("name");
                        Toast.makeText(context, name, Toast.LENGTH_SHORT).show();
                        nameList.add(name);
                    }
                    // 解析完成后回调成功结果
                    listener.onSuccess(nameList);
                } catch (JSONException e) {
                    listener.onError("数据解析失败:" + e.getMessage());
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                listener.onError("网络请求失败:" + error.getMessage());
            }
        });
        requestQueue.add(jsonArrayRequest);
    }
}

步骤3:修改调用逻辑

所有依赖请求结果的操作都要放到回调的onSuccess方法中执行,此时拿到的是已经解析完成的有效数据:

DataBase dataBase = new DataBase(context);
dataBase.getRowdata(new OnDataFetchListener() {
    @Override
    public void onSuccess(List<String> nameList) {
        // 此处可以安全拿到解析完成的姓名列表,添加到你的elements中
        elements.addAll(nameList);
        // 如果需要更新UI,直接在这里操作即可,Volley的onResponse默认回调到主线程
    }

    @Override
    public void onError(String errorMsg) {
        Toast.makeText(context, errorMsg, Toast.LENGTH_SHORT).show();
    }
});

注意:不建议强行将异步请求转为同步执行,会阻塞主线程触发ANR(应用无响应)问题,异步回调是Android网络请求的标准实现方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 07:15:03