Пустой String array
Заметил что Volley загружает json не сразу. Как можно понять что мы получили все данные?
В строке 126. находится метод, выполняющий GET запрос и последующий парсинг. Сам же метод вызывается в строке 60.
Поскольку я паршу json в два String массива, а затем в другом классе вызываю метод getLength(); который возвращает длину main_name_rString. После чего происходит ошибка java.lang.NullPointerException: Attempt to get length of null array . При этом запрос выполняется и не выдает ошибку в виде Toast сообщения(строка 157).
Для примера в коде есть conectionBt.setText(String.valueOf(jsonArray_string_list.length()));(строка 136), являющийся textView. При нажатии на textView происходит вызов метода loadStrings(строка 126). На моменте вызова метода setText() происходит краш.
1. package com.example.dyplom;
2.
3. import androidx.appcompat.app.AlertDialog;
4. import androidx.appcompat.app.AppCompatActivity;
5. import androidx.constraintlayout.widget.ConstraintLayout;
6. import androidx.core.content.ContextCompat;
7.
8. import android.app.Activity;
9. import android.content.DialogInterface;
10. import android.content.Intent;
11. import android.os.Bundle;
12. import android.text.InputType;
13. import android.text.Layout;
14. import android.view.LayoutInflater;
15. import android.view.View;
16. import android.widget.AdapterView;
17. import android.widget.ArrayAdapter;
18. import android.widget.Button;
19. import android.widget.EditText;
20. import android.widget.RelativeLayout;
21. import android.widget.SeekBar;
22. import android.widget.Spinner;
23. import android.widget.TextView;
24. import android.widget.Toast;
25.
26. import com.android.volley.Request;
27. import com.android.volley.RequestQueue;
28. import com.android.volley.Response;
29. import com.android.volley.VolleyError;
30. import com.android.volley.toolbox.JsonObjectRequest;
31. import com.android.volley.toolbox.Volley;
32.
33. import org.json.JSONArray;
34. import org.json.JSONException;
35. import org.json.JSONObject;
36.
37. import yuku.ambilwarna.AmbilWarnaDialog;
38.
39. public class MainActivity extends AppCompatActivity {
40.
41. private TextView contrBt, conectionBt, text1;
42. private String p_pass, p_login;
43. String[] main_name_rString, main_id_rString;
44. private RequestQueue mQueue;
45.
46.
47. @Override
48. protected void onCreate(Bundle savedInstanceState) {
49. super.onCreate(savedInstanceState);
50. setContentView(R.layout.activity_main);
51.
52. mQueue = Volley.newRequestQueue(this);
53.
54. TextView text1 = findViewById(R.id.texttt);
55.
56. TextView conectionBt = (TextView) findViewById(R.id.ConectBtn);
57. conectionBt.setOnClickListener(new View.OnClickListener() {
58. @Override
59. public void onClick(View view) {
60. loadStrings();
61. }
62. });
63.
64.
65.
66.
67. TextView contrBt = (TextView) findViewById(R.id.ControlBt);
68. contrBt.setOnClickListener(new View.OnClickListener() {
69. @Override
70. public void onClick(View view) {
71. Intent ContStart = new Intent(MainActivity.this, Control.class);
72. startActivity(ContStart);
73. }
74. });
75.
76. TextView viewBt = (TextView) findViewById(R.id.ViewBtn);
77. viewBt.setOnClickListener(new View.OnClickListener() {
78. @Override
79. public void onClick(View view) {
80. LayoutInflater inflater = getLayoutInflater();
81. View dialoglayout = inflater.inflate(R.layout.activity_add_rstring, null);
82. AlertDialog.Builder password_check = new AlertDialog.Builder(MainActivity.this);
83.
84. AlertDialog pas_check = password_check.create();
85.
86. pas_check.setTitle("Введите текст");
87. pas_check.setView(dialoglayout);
88.
89. pas_check.setButton(DialogInterface.BUTTON_POSITIVE, "Ok", new DialogInterface.OnClickListener() {
90. @Override
91. public void onClick(DialogInterface dialogInterface, int i) {
92.
93. String p_login = ((EditText) dialoglayout.findViewById(R.id.loggin_login)).getText().toString();
94. String p_pasword = ((EditText) dialoglayout.findViewById(R.id.loggin_password)).getText().toString();
95. if (p_login.equals("Admin") && p_pasword.equals("abc"))
96. {
97. Intent viewStart = new Intent(MainActivity.this, com.example.dyplom.View.class);
98. startActivity(viewStart);
99. pas_check.cancel();
100. } else {
101.
102. ((EditText) dialoglayout.findViewById(R.id.loggin_password)).setText("");
103.
104. Toast toast = Toast.makeText(getApplicationContext(),
105. "Неправильный логин или пароль", Toast.LENGTH_SHORT);
106. toast.show();
107. }
108. }
109. });
110. pas_check.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {
111. @Override
112. public void onClick(DialogInterface dialogInterface, int i) {
113. pas_check.cancel();
114. }
115. });
116. pas_check.show();
117. //Intent viewStart = new Intent(MainActivity.this, com.example.dyplom.View.class);
118. // startActivity(viewStart);
119. }
120. });
121.
122. }
123.
124.
125.
126. private void loadStrings()
127. {
128. String url_head = "https://api.npoint.io/0a84a56ace112bd2cad1";
129. JsonObjectRequest request_strings_list = new JsonObjectRequest(Request.Method.GET,url_head, null, new Response.Listener<JSONObject>() {
130. @Override
131. public void onResponse(JSONObject response) {
132. try {
133. JSONArray jsonArray_string_list = response.getJSONArray("strings_info");
134. main_name_rString = new String[jsonArray_string_list.length()];
135. main_id_rString = new String[jsonArray_string_list.length()];
136. text1.setText(String.valueOf(jsonArray_string_list.length()));
137. for (int i = 0; i < jsonArray_string_list.length();i++){
138. JSONObject string_params_string_list = jsonArray_string_list.getJSONObject(i);
139.
140. String string_id = string_params_string_list.getString("string_id");
141. String string_name = string_params_string_list.getString("string_name");
142.
143.
144. main_name_rString[i] = string_name;
145. main_id_rString[i] = string_id;
146.
147. }
148.
149.
150. } catch (JSONException e) {
151. e.printStackTrace();
152. }
153. }
154. }, new Response.ErrorListener() { // в случае возникновеня ошибки
155. @Override
156. public void onErrorResponse(VolleyError error) {
157. Toast.makeText(getApplicationContext(), "Не работает", Toast.LENGTH_SHORT).show();
158. error.printStackTrace();
159. }
160. });
161. mQueue.add(request_strings_list);
162. }
163.
164. public String getid(int i){return main_id_rString[i];}
165. public String getname(int i){return main_name_rString[i];}
166. public int getsize() {return main_id_rString.length;}
167. }
Ошибка выглядит следующим образом:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.dyplom, PID: 26698
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at com.example.dyplom.MainActivity$4.onResponse(MainActivity.java:134)
at com.example.dyplom.MainActivity$4.onResponse(MainActivity.java:127)
at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:90)
at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:102)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Причем замечу, что при заполнении main_name_rString и main_id_rString не возникает краша приложения. Если убрать conectionBt.setText(String.valueOf(jsonArray_string_list.length())); метод выполнится "корректно", но при вызове метода, возвращающего длину main_name_rString и main_id_rString будет возникать ошибка java.lang.NullPointerException: Attempt to get length of null array