我需要在volley onResponse方法之外访问此arrayList。但是它返回了IndexOutOfBoundsException。
public ArrayList<QuestionAnswer> arrayList;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
arrayList = new ArrayList<>();
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, getTalkById, new JSONObject(params),
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
JSONObject data = response.optJSONObject("data");
JSONArray highSchoolQuesAns = data.optJSONArray("questions").optJSONObject(0).optJSONArray("answers");
for (int i = 0; i < highSchoolQuesAns.length(); i++) {
String question = highSchoolQuesAns.optJSONObject(i).optString("question");
String answer = highSchoolQuesAns.optJSONObject(i).optString("answer");
arrayList.add(new QuestionAnswer(question, answer));
// adding new QuestionAnswer
}
Log.v("test",arrayList.get(0).question); // value is available here inside on response. And getting question of first arrayList element.
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d("Error", "Error: " + error.getMessage());
}
}
);
request.setRetryPolicy(new DefaultRetryPolicy(
VolleyApplication.TIMEOUT,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
VolleyApplication.getInstance().getRequestQueue().add(request);
Log.v("test",arrayList.get(0).question); //java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
//This is where the issue is. AND I REALLY NEED TO access this arraylist outside of volley onResponse method
}
正如您所见,我正在尝试登录两个地方。从onResponse登录确实会返回一些东西,但在onResponse之外它只会给出IndexOutOfBoundException。我做了很多调试,并意识到onResponse arrayList之外是空的(我试图访问一个不存在的空元素)。在onResponse中修改的ArrayList无法在外部访问。即使它是全球/类级变量
答案 0 :(得分:3)
我建议你在排球成功回应之后有单独的方法,如下所示
public ArrayList<QuestionAnswer> arrayList;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
arrayList = new ArrayList<>();
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, getTalkById, new JSONObject(params),
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
JSONObject data = response.optJSONObject("data");
JSONArray highSchoolQuesAns = data.optJSONArray("questions").optJSONObject(0).optJSONArray("answers");
for (int i = 0; i < highSchoolQuesAns.length(); i++) {
String question = highSchoolQuesAns.optJSONObject(i).optString("question");
String answer = highSchoolQuesAns.optJSONObject(i).optString("answer");
arrayList.add(new QuestionAnswer(question, answer));
// adding new QuestionAnswer
}
GetArrayValue();
Log.v("test",arrayList.get(0).question); // value is available here inside on response. And getting question of first arrayList element.
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d("Error", "Error: " + error.getMessage());
}
}
);
request.setRetryPolicy(new DefaultRetryPolicy(
VolleyApplication.TIMEOUT,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
VolleyApplication.getInstance().getRequestQueue().add(request);
}
private void GetArrayValue(){
Log.v("test",arrayList.get(0).question);
}