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
相关产品推荐
相关产品推荐

