#java #android #arrays
#java #Android #массивы
Вопрос:
это выдает мне кучу ошибок в logcat. но если я удаляю Log.d("intheclass", questionsArray.get(0));
, он не показывает ошибок и приложение не запускается. с этим кодом приложение не запускается. Я попытался зарегистрировать сам ответ, это работает. Абсолютно понятия не имею, почему этот массив не работает.
package com.example.trivia.data;
import android.util.Log;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.example.trivia.controller.AppControl;
import org.json.JSONArray;
import org.json.JSONException;
import java.util.ArrayList;
import java.util.List;
public class QuestionBank {
private String que1;
String url = "https://raw.githubusercontent.com/curiousily/simple-quiz/master/script/statements.json";
ArrayList<String> questionsArray= new ArrayList<String>();
public List<String> getQuestions(){
JsonArrayRequest bank = new JsonArrayRequest(Request.Method.GET, url, null,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
for(int i=0; i<response.length(); i ){
try {
que1 = (String) response.getJSONArray(i).get(0);
Log.d("queva", String.valueOf(i));
questionsArray.add(que1);
} catch (JSONException e) {
e.printStackTrace();
}
}
//if(callback != null) callback.processFinish(questionsArray);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
AppControl.getInstance().addToRequestQueue(bank);
Log.d("intheclass", questionsArray.get(0));
return questionsArray;
}
}
Комментарии:
1. Возможно, если questionsArray заполняется асинхронно, он не будет заполнен, когда основной поток достигнет инструкции Log.d . Хотя вы, вероятно, захотите опубликовать полную ошибку, которую вы видите.
Ответ №1:
к моменту попытки доступа он пуст. Когда вы вызываете getQuestions(), он отправляется в другой рабочий поток для добавления значений в questionsArray, но ваш журнал находится в основном потоке и находится в последовательном вызове, поэтому он не будет работать и приведет к сбою.
Возможное решение.
public void getQuestions(){
JsonArrayRequest bank = new JsonArrayRequest(Request.Method.GET, url, null,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
for(int i=0; i<response.length(); i ){
try {
que1 = (String) response.getJSONArray(i).get(0);
Log.d("queva", String.valueOf(i));
questionsArray.add(que1);
doSomething(); //here calling
} catch (JSONException e) {
e.printStackTrace();
}
}
//if(callback != null) callback.processFinish(questionsArray);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
}
}
и вызовите это из onRepsonse() после успешного вызова api.
public void doSomething(){
AppControl.getInstance().addToRequestQueue(bank);
Log.d("intheclass", questionsArray.get(0));
}