Foros del Web » Programación para mayores de 30 ;) » Java »

Java. En un hilo meto 8 elementos en un array, y otro hilo dice que el array tiene 0

Estas en el tema de Java. En un hilo meto 8 elementos en un array, y otro hilo dice que el array tiene 0 en el foro de Java en Foros del Web. Contexto. Estoy ejecutando 3 hilos: el 1ro se encarga de asignar valor a unas variables estáticas, el 2do y 3ro trabajan con esas variables Problema: ...
  #1 (permalink)  
Antiguo 22/03/2020, 21:37
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 556
Antigüedad: 7 años, 1 mes
Puntos: 21
Pregunta Java. En un hilo meto 8 elementos en un array, y otro hilo dice que el array tiene 0

Contexto. Estoy ejecutando 3 hilos: el 1ro se encarga de asignar valor a unas variables estáticas, el 2do y 3ro trabajan con esas variables
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
  1. package com.example.activities;
  2.  
  3. import utils.hilos.Hilo1;
  4. import utils.hilos.Hilo2;
  5. import utils.paginator.Paginator;
  6. import static utils.paginator.Paginator.TOTAL_PAGES;
  7.  
  8. public class MainActivity extends AppCompatActivity {
  9.  
  10.     RecyclerView rv;
  11.     Button nextBtn, prevBtn;
  12.     Paginator paginador = new Paginator(MainActivity.this);
  13.     private int paginaActual = 1;
  14.  
  15.     @Override
  16.     protected void onCreate(Bundle savedInstanceState) {
  17.         super.onCreate(savedInstanceState);
  18.         setContentView(R.layout.activity_main);
  19.  
  20.         Hilo1 hilo1 = new Hilo1(MainActivity.this);
  21.         hilo1.start();
  22.  
  23.         List params = new ArrayList();
  24.         params.add(MainActivity.this);
  25.         params.add(hilo1);
  26.         params.add(rv);
  27.         params.add(paginador);
  28.         params.add(paginaActual);
  29.         Hilo2 hilo2 = new Hilo2(params);
  30.         hilo2.start();
  31.     }
  32. }

Hilo1.java

Código Java:
Ver original
  1. package utils.hilos;
  2.  
  3. import static utils.Constantes.pathWebservices;
  4.  
  5. public class Hilo1 extends Thread {
  6.  
  7.     Context contexto;
  8.  
  9.     public Hilo1(Context contexto) {
  10.         this.contexto = contexto;
  11.     }
  12.  
  13.     @Override
  14.     public void run() {
  15.         String pathWebservicePHP = pathWebservices + "get/num_total_items.php?tipo=libros";
  16.         List params1 = new ArrayList();
  17.         params1.add("getNumTotalItems");
  18.         params1.add(contexto);
  19.         params1.add(pathWebservicePHP);
  20.         new VolleyListener2(params1);
  21.     }
  22. }

Hilo2.java
Código Java:
Ver original
  1. package utils.hilos;
  2.  
  3. import static utils.paginator.Paginator.TOTAL_NUM_ITEMS;
  4.  
  5. public class Hilo2 extends Thread {
  6.     private Thread       hilo;
  7.     private Context      contexto;
  8.     private RecyclerView rv;
  9.     private Paginator    paginador;
  10.     private int          paginaActual;
  11.  
  12.     public Hilo2(List params) {
  13.         this.contexto = (Context) params.get(0);
  14.         this.hilo = (Thread)params.get(1);
  15.         this.rv = (RecyclerView) params.get(2);
  16.         this.paginador = (Paginator) params.get(3);
  17.         this.paginaActual = (int)params.get(4);
  18.     }
  19.  
  20.     @Override
  21.     public void run() {
  22.         try {
  23.             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!
  24.         }
  25.         catch (InterruptedException e) {
  26.             e.printStackTrace();
  27.         }
  28.  
  29.         // 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)
  30.         Handler handler = new Handler(Looper.getMainLooper());
  31.         handler.post(new Runnable() {
  32.             @Override
  33.             public void run() {
  34.                 Log.println(Log.INFO, "infor", "A esta altura TOTAL_NUM_ITEMS debe haberse sobre-escrito: "+TOTAL_NUM_ITEMS);
  35.                 Toast.makeText(contexto, "AAAAjjjj! Total: "+TOTAL_NUM_ITEMS, Toast.LENGTH_LONG).show();
  36.                 rv.setAdapter(new RecyclerViewAdapter(contexto, paginador.generatePage(paginaActual)));
  37.             }
  38.         });
  39.     }
  40. }


Hilo3.java
Código Java:
Ver original
  1. package utils.hilos;
  2.  
  3. public class Hilo3 extends Thread {
  4.     private List params;
  5.  
  6.     public Hilo3(List params) {
  7.         this.params = params;
  8.     }
  9.  
  10.     @Override
  11.     public void run() {
  12.         new VolleyListener2(params);
  13.     }
  14. }



Paginator.java
Código Java:
Ver original
  1. package utils.paginator;
  2.  
  3. public class Paginator {
  4.  
  5.     private Context contexto;
  6.     public static int TOTAL_NUM_ITEMS;
  7.     public static int ITEMS_PER_PAGE = 3;
  8.     public static int ITEMS_EN_LAST_PAGE = TOTAL_NUM_ITEMS % ITEMS_PER_PAGE;
  9.     public static float TOTAL_PAGES_FLOAT;
  10.     public static int TOTAL_PAGES;
  11.     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
  12.  
  13.     public Paginator(Context contexto) {
  14.         this.contexto = contexto;
  15.     }
  16.  
  17.     public ArrayList<String> generatePage(int paginaActual) {
  18.  
  19.         String pathWebservicePHP2 = pathWebservices+"get/libros_per_page.php?page="+paginaActual+"&items_per_page="+ITEMS_PER_PAGE;
  20.         List params = new ArrayList();
  21.         params.add("getLibrosForPaginator");
  22.         params.add(contexto);
  23.         params.add(pathWebservicePHP2);
  24.         params.add(paginaActual);
  25.  
  26.         Hilo3 hilo3 = new Hilo3(params);
  27.         hilo3.start();
  28.  
  29.         // 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.
  30.  
  31.  
  32.         // AQUÍ ESTÁ EL PROBLEMA. arrayDataLibros.size() SIEMPRE devuelve 0, ¿por qué?
  33.         AlertDialog.Builder alerta = new AlertDialog.Builder(contexto);
  34.         alerta.setMessage("Elementos dentro de arrayDataLibros: "+arrayDataLibros.size()).setNegativeButton("Aceptar", null).create().show();
  35.  
  36.         return arrayDataLibros;
  37.     }
  38.  
  39.     public static void setTotalNumItems(int totalNumItems) {
  40.         TOTAL_NUM_ITEMS = totalNumItems;
  41.     }
  42. }



VolleyListener2.java
Código Java:
Ver original
  1. package utils;
  2.  
  3. import static utils.paginator.Paginator.ITEMS_PER_PAGE;
  4. import static utils.paginator.Paginator.TOTAL_NUM_ITEMS;
  5. import static utils.paginator.Paginator.TOTAL_PAGES;
  6. import static utils.paginator.Paginator.TOTAL_PAGES_FLOAT;
  7. import static utils.paginator.Paginator.ITEMS_EN_LAST_PAGE;
  8. import static utils.paginator.Paginator.arrayDataLibros; // Aquí llamo la variable que me da problemas
  9.  
  10. public class VolleyListener2 {
  11.  
  12.     public VolleyListener2(List params) {
  13.         this.peticion = (String) params.get(0);
  14.  
  15.         if (peticion.equals("getNumTotalItems")){
  16.             this.contexto = (Context) params.get(1);
  17.             this.pathWebservicePHP = (String) params.get(2);
  18.         }
  19.         else if (peticion.equals("getLibrosForPaginator")) {
  20.             this.contexto = (Context) params.get(1);
  21.             this.pathWebservicePHP = (String) params.get(2);
  22.             this.paginaActual = (int) params.get(3);
  23.         }
  24.  
  25.         Response.Listener<String> respuesta = new Response.Listener<String>() {
  26.             @Override
  27.             public void onResponse(String response) {
  28.                 try {
  29.                     // objetoRespuesta guarda cada uno de los elementos que PHP nos envía en un jSON tras completar su trabajo
  30.                     JSONObject objetoRespuesta = new JSONObject(response);
  31.                     boolean estatus       = objetoRespuesta.getBoolean("estatus");
  32.                     String  errores       = objetoRespuesta.getString("errores");
  33.                     int     numtotalitems = objetoRespuesta.getInt("numtotalitems");
  34.  
  35.                     if (errores.length() == 0) {
  36.                         if (estatus == true) {
  37.  
  38.                             String nombreFromJSON;
  39.  
  40.                             if (peticion.equals("getNumTotalItems")){
  41.                                 Paginator.setTotalNumItems(numtotalitems);
  42.                                 TOTAL_PAGES_FLOAT = (float) TOTAL_NUM_ITEMS / (float) ITEMS_PER_PAGE;
  43.                                 TOTAL_PAGES = (int) Math.ceil(TOTAL_PAGES_FLOAT);
  44.                                 ITEMS_EN_LAST_PAGE = TOTAL_NUM_ITEMS % ITEMS_PER_PAGE;
  45.                             }
  46.  
  47.                             else if (peticion.equals("getLibrosForPaginator")) {
  48.  
  49.                                 String libros = objetoRespuesta.getString("libros");
  50.                                 JSONArray jsonArrayLibros = new JSONArray(libros);
  51.  
  52.                                 for (int k=0; k<jsonArrayLibros.length(); k++) {
  53.  
  54.                                     Object objetoLibro = jsonArrayLibros.get(k);
  55.                                     JSONObject libro = (JSONObject)objetoLibro;
  56.                                     nombreFromJSON = (String)libro.get("nombre");
  57.  
  58.                                     arrayDataLibros.add(nombreFromJSON); // Aquí lleno el arrayDataLibros
  59.                                 }
  60.                                 System.out.print(arrayDataLibros.size()); // La consola muestra que en esta línea, arrayDataLibros contiene 8 elementos
  61.                             }
  62.                         }
  63.                     }
  64.                 }
  65.                 catch(JSONException e) {}
  66.             }
  67.         };
  68.  
  69.         // Finalmente, ahora sí como tal hacemos la petición a la BBDD con PHP con Volley como intermediario
  70.         if (peticion.equals("getNumTotalItems") || peticion.equals("getLibrosForPaginator")){
  71.             DataBase peticionDataBase = new DataBase(peticion, pathWebservicePHP, respuesta);
  72.             RequestQueue cola = Volley.newRequestQueue(contexto);
  73.             cola.add(peticionDataBase);
  74.         }
  75.     }
  76. }

Muchas gracias,



La zona horaria es GMT -6. Ahora son las 09:55.