为何无法访问JsonObjectRequest内部数组?返回二维数组报错求助
问题根源
你的代码出错核心原因是Volley的网络请求是异步执行的:
- 调用
queue.add(jsonObjectRequest)后,主线程会立刻执行return QnA,但此时请求还没完成,回调里的数组填充逻辑根本没执行 - 而且
QnA是回调内部的局部变量,外部作用域找不到这个变量,编译阶段就会报错
正确解决方案:用回调接口传递异步数据
不能直接用return返回异步请求的数据,得用回调接口在请求完成后把数据传递出去,步骤如下:
1. 定义回调接口
先定义一个接口,用来接收请求成功或失败的通知:
public interface QnACallback { void onSuccess(String[][] qnaData); void onFailure(String errorMessage); }
2. 修改QuestionAns方法
把方法改成无返回值,接收回调接口作为参数,在Volley的回调里触发接口方法:
public void QuestionAns(QnACallback callback) { String url = "https://testing.testing/q-bank/QnA.php?category=" + this.subject + "&&STD=" + this.std; String[] questions = new String[10]; String[] options1 = new String[10]; String[] options2 = new String[10]; String[] options3 = new String[10]; String[] options4 = new String[10]; String[] answers = new String[10]; RequestQueue queue = Volley.newRequestQueue(this.context); JsonObjectRequest jsonObjectRequest = new JsonObjectRequest (Request.Method.GET, url, null, response -> { try { JSONArray questionArr = response.getJSONArray("question"); JSONArray option1Arr = response.getJSONArray("option1"); JSONArray option2Arr = response.getJSONArray("option2"); JSONArray option3Arr = response.getJSONArray("option3"); JSONArray option4Arr = response.getJSONArray("option4"); JSONArray answerArr = response.getJSONArray("answer"); for (int i = 0; i < questionArr.length(); i++){ questions[i] = questionArr.getString(i); options1[i] = option1Arr.getString(i); options2[i] = option2Arr.getString(i); options3[i] = option3Arr.getString(i); options4[i] = option4Arr.getString(i); answers[i] = answerArr.getString(i); } String[][] QnA = {questions, options1, options2, options3, options4, answers}; // 请求成功,把数据通过回调传出去 callback.onSuccess(QnA); } catch (JSONException e) { e.printStackTrace(); callback.onFailure("解析数据失败:" + e.getMessage()); } }, error -> { String errorMsg = "请求失败:" + error.getMessage(); Toast.makeText(context, errorMsg, Toast.LENGTH_SHORT).show(); callback.onFailure(errorMsg); }); queue.add(jsonObjectRequest); }
3. 调用QuestionAns方法
在需要获取数据的地方,传入回调实现来接收数据:
// 假设在Activity或Fragment中调用 yourInstance.QuestionAns(new QnACallback() { @Override public void onSuccess(String[][] qnaData) { // 这里就能拿到填充好的二维数组,做后续逻辑 String[] questions = qnaData[0]; String[] correctAnswers = qnaData[5]; // ... 你的业务代码 } @Override public void onFailure(String errorMessage) { // 处理失败情况,比如提示用户 Toast.makeText(getContext(), errorMessage, Toast.LENGTH_SHORT).show(); } });
额外提示
- 别用
Thread.sleep()或同步请求等待数据,会阻塞主线程触发ANR(应用无响应) - 如果项目用了Jetpack,也可以用
LiveData观察数据变化,写法更简洁,本质也是异步通知思路
内容的提问来源于stack exchange,提问作者Ratnadeep Paul
相关产品推荐
相关产品推荐

