Я пытаюсь инициализировать глобальный ArrayList из слушателя (для работы с объектами JSONArray из библиотеки Volley в разных местах кода). Однако, когда я пытаюсь получить к нему доступ в методе Oncreate, он кажется неинициализированным.

Я пробовал то же самое с разными статическими и нестатическими переменными, например int [], String и т. д., но проблема, похоже, сохраняется.

ПРИМЕЧАНИЕ. Класс Question используется для разработки приложений:

public class Question {

private String question;
private boolean answer;



public Question(String question, boolean answer){
    this.question = question;
    this.answer = answer;
}

public String getQuestion() {
    return question;
}

public boolean isAnswer() {
    return answer;
}

}

public class MainActivity extends AppCompatActivity implements View.OnClickListener {




private String url = "https://raw.githubusercontent.com/curiousily/simple-quiz/master/script/statements-data.json";
private static  ArrayList<Question> questionArrayList = new ArrayList<>();
int  [] intArr = new int[10];
String str = "Hello";



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    // calling the method where the variables are re-initialized
    getQuestions();

    // printing results after re-initialization
    System.out.println("Mainactivity======================");
    System.out.println("intArray: "+ intArr[0]);
    System.out.println("STR: "+ str);
    System.out.println(questionArrayList.get(0).getQuestion());





}



public void getQuestions(){

    JsonArrayRequest arrayRequest = new JsonArrayRequest(Request.Method.GET, url, null,
            new Response.Listener<JSONArray>() {

               // Response Listener
                @Override
                public void onResponse(JSONArray response) {


                    // Test variables:
                    MainActivity.this.intArr[0] = 110;
                    str = "HI";



                    for(int i=0; i< response.length(); i++){
                        try {
                            // initializing ArrayList<Question>
                            questionArrayList.add(new Question(response.getJSONArray(i).getString(0), response.getJSONArray(i).getBoolean(1) ));
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }




                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });

   RequestQueue queue = Volley.newRequestQueue(this);
   queue.add(arrayRequest);


}

}

Выход:

I / System.out: Mainacctivity ======================

I / System.out: intArray: 0

STR: Привет

D / AndroidRuntime: Завершение работы виртуальной машины E / AndroidRuntime: ФАКТИЧЕСКОЕ ИСКЛЮЧЕНИЕ: основной процесс: myapp.com.triviaapp, PID: 29167 java.lang.RuntimeException: Невозможно запустить действие ComponentInfo {myapp.com.triviaapp / myapp.com.triviaapp. MainActivity}: java.lang.IndexOutOfBoundsException: индекс: 0, размер: 0

0
Fael.B 20 Май 2019 в 17:21

2 ответа

Лучший ответ

String модифицируется слушателем, однако слушатель исполняется в более поздний момент времени после завершения onCreate. Если вы добавите второй журнал в прослушиватель, вы увидите, что он вызывается впоследствии. Это связано с тем, что слушатель не выполняется, пока не получит ответ от сети, что всегда будет занимать больше времени, чем onCreate, чтобы завершить выполнение.

0
chris2112 20 Май 2019 в 14:25

System.out.println(questionArrayList.get(0).getQuestion()); <- здесь вылетает, потому что список массивов пуст.

Вы можете поместить информацию для печати после получения результата:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // calling the method where the variables are re-initialized
    getQuestions();
}
@Override
public void onResponse(JSONArray response) {

    // Test variables:
    MainActivity.this.intArr[0] = 110;
    str = "HI";

    for(int i=0; i< response.length(); i++){
        try {
            // initializing ArrayList<Question>
            questionArrayList.add(new Question(response.getJSONArray(i).getString(0), response.getJSONArray(i).getBoolean(1) ));
        } catch (JSONException e) { 
            e.printStackTrace();
        }
    }

    System.out.println("Mainactivity======================");
    System.out.println("intArray: "+ intArr[0]);
    System.out.println("STR: "+ str);
    if (!questionArrayList.isEmpty()) { // and check if we have at least one element
        System.out.println(questionArrayList.get(0).getQuestion());
    }
}
0
walkmn 20 Май 2019 в 14:33