java - ArrayList está vacío después de agregar elementos
android (2)
Tengo este código de Android que trae un JSON de un servidor y llena una ArrayList de ese JSON. Verifiqué el tamaño de las "comidas" de ArrayList dentro del vacío de respuesta que me da 1, pero cuando lo verifico después del objeto StringRequest obtengo 0 elementos. . Las comidas se definen en el ámbito global y se inicializan dentro de la función oncreateview El Código:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
Log.i("debug","on create view");
View view =inflater.inflate(R.layout.fragment_meal_list,container,false);
ListView List ;
meals=new ArrayList<meal>();
String url="http://syriankitchen.tk/get_recent.php";
StringRequest mealsrequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try{
JSONObject object= new JSONObject(response);
JSONArray mealsArray = object.getJSONArray("result");
for(int i=0;i<mealsArray.length();i++){
JSONObject cur = mealsArray.getJSONObject(i);
int id= cur.getInt("id");
String name= cur.getString("name");
String description = cur.getString("description");
int price = cur.getInt("price");
meals.add(new meal(id,name,price,description));
}
Log.i("debug","meals size = "+meals.size());
}
catch(JSONException e){
e.printStackTrace();
}
}
},new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getActivity(),error.getMessage(),Toast.LENGTH_SHORT).show();
}
});
Volley.newRequestQueue(getActivity()).add(mealsrequest);
ArrayList<String> strs=new ArrayList<String>();
String mealsnames[]=new String[meals.size()];
for(int i=0;i<meals.size();i++)strs.add(meals.get(i).getName());
strs.toArray(mealsnames);
Log.i("debug","meals ou size "+meals.size());
CustomList adapter = new CustomList(getActivity(),mealsnames,meals);
List = (ListView)view.findViewById(R.id.list);
List.setAdapter(adapter);
Cuando escribes esto ...
Volley.newRequestQueue(getActivity()).add(mealsrequest);
Eso significa que está haciendo una llamada asincrónica y que la
mealsrequest
se ejecutará en otro hilo.
Estás imprimiendo
Log.i("debug","meals ou size "+meals.size());
justo después de hacer su
mealsrequest
.
Cuando el control llega a esta declaración, su solicitud de red aún no se ha completado.
Aparentemente, no tienes nada en tu lista.
Su lista se completará solo en
onResponse()
, ya que ese método se ejecuta después de que se completa la solicitud de red.
El problema aquí es entender cómo funcionan
asynchronous
tareas
asynchronous
.
Cuando agrega una solicitud de
volley
a la queque, se ejecutará en el
subproceso de fondo
(fuera del subproceso principal) y el control pasará a la siguiente línea.
Entonces, después de esto:
Volley.newRequestQueue(getActivity()).add(mealsrequest);
el control pasa a esto:
ArrayList<String> strs=new ArrayList<String>();
String mealsnames[]=new String[meals.size()];
Ahora, dado que las
meals
se actualizan en el subproceso de fondo, no puede obtener los datos cuando el control llega a
String mealsnames[]=new String[meals.size()];
Por lo tanto, obtendrá
un
tamaño
cero
(
meals.size()
) aquí.
Intente mover esta parte del código a
onResponse
.
Intenta así:
public void updateData(){
ArrayList<String> strs=new ArrayList<String>();
String mealsnames[]=new String[meals.size()];
for(int i=0;i<meals.size();i++)strs.add(meals.get(i).getName());
strs.toArray(mealsnames);
Log.i("debug","meals ou size "+meals.size());
CustomList adapter = new CustomList(getActivity(),mealsnames,meals);
List = (ListView)view.findViewById(R.id.list);
List.setAdapter(adapter);
}
y llame a este método desde
onResponse
:
@Override
public void onResponse(String response) {
try{
JSONObject object= new JSONObject(response);
JSONArray mealsArray = object.getJSONArray("result");
for(int i=0;i<mealsArray.length();i++){
JSONObject cur = mealsArray.getJSONObject(i);
int id= cur.getInt("id");
String name= cur.getString("name");
String description = cur.getString("description");
int price = cur.getInt("price");
meals.add(new meal(id,name,price,description));
}
Log.i("debug","meals size = "+meals.size());
updateData();
}
catch(JSONException e){
e.printStackTrace();
}
}