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

为何无法访问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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:48:23