全局变量未从侦听器中初始化
Global variable are not being initialized from within a listener
我正在尝试从侦听器中初始化全局 ArrayList(以在代码的不同位置处理来自 Volley 库的 JSONArray 对象)。但是,当我尝试在 Oncreate 方法中访问它时,它似乎未初始化。
我对不同的静态和非静态变量进行了同样的尝试 i.g。 int[]、String 等,但问题似乎仍然存在。
注意:
问题 class 用于应用程序开发目的:
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: Mainactivity======================
I/System.out: intArray: 0
STR:你好
D/AndroidRuntime: 正在关闭虚拟机
E/AndroidRuntime:致命异常:main
进程:myapp.com.triviaapp,PID:29167
java.lang.RuntimeException:无法启动 activity ComponentInfo{myapp.com.triviaapp/myapp.com.triviaapp.MainActivity}:java.lang.IndexOutOfBoundsException:索引:0,大小:0
侦听器正在修改字符串,但是侦听器会在稍后的某个时间点执行,在 onCreate 完成后。如果您在侦听器中添加第二个日志,您将看到它随后被调用。这是因为侦听器在收到来自网络的响应之前不会被执行,这总是比 onCreate 完成执行所花费的时间更长
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());
}
}
我正在尝试从侦听器中初始化全局 ArrayList(以在代码的不同位置处理来自 Volley 库的 JSONArray 对象)。但是,当我尝试在 Oncreate 方法中访问它时,它似乎未初始化。
我对不同的静态和非静态变量进行了同样的尝试 i.g。 int[]、String 等,但问题似乎仍然存在。
注意: 问题 class 用于应用程序开发目的:
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: Mainactivity======================
I/System.out: intArray: 0
STR:你好
D/AndroidRuntime: 正在关闭虚拟机 E/AndroidRuntime:致命异常:main 进程:myapp.com.triviaapp,PID:29167 java.lang.RuntimeException:无法启动 activity ComponentInfo{myapp.com.triviaapp/myapp.com.triviaapp.MainActivity}:java.lang.IndexOutOfBoundsException:索引:0,大小:0
侦听器正在修改字符串,但是侦听器会在稍后的某个时间点执行,在 onCreate 完成后。如果您在侦听器中添加第二个日志,您将看到它随后被调用。这是因为侦听器在收到来自网络的响应之前不会被执行,这总是比 onCreate 完成执行所花费的时间更长
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());
}
}