Problema: Los hilos 2 y 3 no recuperan el valor asignado a las variables
¿Dónde está el problema? Supongo que los hilos 2 y 3 se están ejecutando antes que termine el hilo 1
¿Ahora quién podrá ayudarme? ¿Dónde puede estar el error?
Van los códigos en que estoy trabajando, los he simplificado lo más que pude. Ojalá puedan echarme una mano. Cualquier ayuda, por pequeña que sea, me sería de gran utilidad.
MainActivity.java
Código Java:
Ver original
package com.example.activities; import utils.hilos.Hilo1; import utils.hilos.Hilo2; import utils.paginator.Paginator; import static utils.paginator.Paginator.TOTAL_PAGES; public class MainActivity extends AppCompatActivity { RecyclerView rv; Button nextBtn, prevBtn; Paginator paginador = new Paginator(MainActivity.this); private int paginaActual = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Hilo1 hilo1 = new Hilo1(MainActivity.this); hilo1.start(); params.add(MainActivity.this); params.add(hilo1); params.add(rv); params.add(paginador); params.add(paginaActual); Hilo2 hilo2 = new Hilo2(params); hilo2.start(); } }
Hilo1.java
Código Java:
Ver original
package utils.hilos; import static utils.Constantes.pathWebservices; Context contexto; this.contexto = contexto; } @Override public void run() { params1.add("getNumTotalItems"); params1.add(contexto); params1.add(pathWebservicePHP); new VolleyListener2(params1); } }
Hilo2.java
Código Java:
Ver original
package utils.hilos; import static utils.paginator.Paginator.TOTAL_NUM_ITEMS; private RecyclerView rv; private Paginator paginador; private int paginaActual; this.rv = (RecyclerView) params.get(2); this.paginador = (Paginator) params.get(3); this.paginaActual = (int)params.get(4); } @Override public void run() { try { hilo.join(); // Este join debería lograr que NO se ejecuté el código de abajo (el handler) hasta que no termine el hilo que aquí se pasa como parámetro (hilo1), ¡pero esto no está pasando! } e.printStackTrace(); } // Con este handler logramos manipular la interfaz gráfica mediante este hilo. Por lo que podemos hacer un toast y también trabajar con el recycler view (rv) (este código creo que es irrelevante pero lo dejo igual) Handler handler = new Handler(Looper.getMainLooper()); @Override public void run() { Log.println(Log.INFO, "infor", "A esta altura TOTAL_NUM_ITEMS debe haberse sobre-escrito: "+TOTAL_NUM_ITEMS); Toast.makeText(contexto, "AAAAjjjj! Total: "+TOTAL_NUM_ITEMS, Toast.LENGTH_LONG).show(); rv.setAdapter(new RecyclerViewAdapter(contexto, paginador.generatePage(paginaActual))); } }); } }
Hilo3.java
Código Java:
Ver original
Paginator.java
Código Java:
Ver original
package utils.paginator; public class Paginator { public static int TOTAL_NUM_ITEMS; public static int ITEMS_PER_PAGE = 3; public static int ITEMS_EN_LAST_PAGE = TOTAL_NUM_ITEMS % ITEMS_PER_PAGE; public static float TOTAL_PAGES_FLOAT; public static int TOTAL_PAGES; public static ArrayList<String> arrayDataLibros = new ArrayList<>(); // Aquí es donde se declara la variable con la cual tengo problemas para recuperar su valor desde el hilo 2 this.contexto = contexto; } public ArrayList<String> generatePage(int paginaActual) { String pathWebservicePHP2 = pathWebservices+"get/libros_per_page.php?page="+paginaActual+"&items_per_page="+ITEMS_PER_PAGE; params.add("getLibrosForPaginator"); params.add(contexto); params.add(pathWebservicePHP2); params.add(paginaActual); Hilo3 hilo3 = new Hilo3(params); hilo3.start(); // Sólo si meto aquí un sleep(1000), el alerta de aquí abajo sí recupera el valor correcto de arrayDataLibros.size(). Obviamente no voy a poner un sleep. // AQUÍ ESTÁ EL PROBLEMA. arrayDataLibros.size() SIEMPRE devuelve 0, ¿por qué? AlertDialog.Builder alerta = new AlertDialog.Builder(contexto); alerta.setMessage("Elementos dentro de arrayDataLibros: "+arrayDataLibros.size()).setNegativeButton("Aceptar", null).create().show(); return arrayDataLibros; } public static void setTotalNumItems(int totalNumItems) { TOTAL_NUM_ITEMS = totalNumItems; } }
VolleyListener2.java
Código Java:
Ver original
package utils; import static utils.paginator.Paginator.ITEMS_PER_PAGE; import static utils.paginator.Paginator.TOTAL_NUM_ITEMS; import static utils.paginator.Paginator.TOTAL_PAGES; import static utils.paginator.Paginator.TOTAL_PAGES_FLOAT; import static utils.paginator.Paginator.ITEMS_EN_LAST_PAGE; import static utils.paginator.Paginator.arrayDataLibros; // Aquí llamo la variable que me da problemas public class VolleyListener2 { if (peticion.equals("getNumTotalItems")){ } else if (peticion.equals("getLibrosForPaginator")) { this.paginaActual = (int) params.get(3); } Response.Listener<String> respuesta = new Response.Listener<String>() { @Override try { // objetoRespuesta guarda cada uno de los elementos que PHP nos envía en un jSON tras completar su trabajo JSONObject objetoRespuesta = new JSONObject(response); boolean estatus = objetoRespuesta.getBoolean("estatus"); int numtotalitems = objetoRespuesta.getInt("numtotalitems"); if (errores.length() == 0) { if (estatus == true) { String nombreFromJSON; if (peticion.equals("getNumTotalItems")){ Paginator.setTotalNumItems(numtotalitems); TOTAL_PAGES_FLOAT = (float) TOTAL_NUM_ITEMS / (float) ITEMS_PER_PAGE; ITEMS_EN_LAST_PAGE = TOTAL_NUM_ITEMS % ITEMS_PER_PAGE; } else if (peticion.equals("getLibrosForPaginator")) { JSONArray jsonArrayLibros = new JSONArray(libros); for (int k=0; k<jsonArrayLibros.length(); k++) { JSONObject libro = (JSONObject)objetoLibro; arrayDataLibros.add(nombreFromJSON); // Aquí lleno el arrayDataLibros } System.out.print(arrayDataLibros.size()); // La consola muestra que en esta línea, arrayDataLibros contiene 8 elementos } } } } catch(JSONException e) {} } }; // Finalmente, ahora sí como tal hacemos la petición a la BBDD con PHP con Volley como intermediario if (peticion.equals("getNumTotalItems") || peticion.equals("getLibrosForPaginator")){ DataBase peticionDataBase = new DataBase(peticion, pathWebservicePHP, respuesta); RequestQueue cola = Volley.newRequestQueue(contexto); cola.add(peticionDataBase); } } }
Muchas gracias,