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 originalpackage 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;
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 originalpackage utils.hilos;
import static utils.Constantes.pathWebservices;
public class Hilo1
extends Thread {
this.contexto = contexto;
}
@Override
public void run() {
String pathWebservicePHP
= pathWebservices
+ "get/num_total_items.php?tipo=libros"; params1.add("getNumTotalItems");
params1.add(contexto);
params1.add(pathWebservicePHP);
new VolleyListener2(params1);
}
}
Hilo2.java
Código Java:
Ver originalpackage utils.hilos;
import static utils.paginator.Paginator.TOTAL_NUM_ITEMS;
public class Hilo2
extends Thread { private RecyclerView rv;
private Paginator paginador;
private int paginaActual;
public Hilo2
(List params
) { this.
contexto = (Context) params.
get(0); this.
hilo = (Thread)params.
get(1); 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 originalpackage utils.hilos;
public class Hilo3
extends Thread {
public Hilo3
(List params
) { this.params = params;
}
@Override
public void run() {
new VolleyListener2(params);
}
}
Paginator.java
Código Java:
Ver originalpackage 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
public Paginator
(Context contexto
) { 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 originalpackage 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 {
public VolleyListener2
(List params
) { this.
peticion = (String) params.
get(0);
if (peticion.equals("getNumTotalItems")){
this.
contexto = (Context) params.
get(1); this.
pathWebservicePHP = (String) params.
get(2); }
else if (peticion.equals("getLibrosForPaginator")) {
this.
contexto = (Context) params.
get(1); this.
pathWebservicePHP = (String) params.
get(2); this.paginaActual = (int) params.get(3);
}
Response.Listener<String> respuesta = new Response.Listener<String>() {
@Override
public void onResponse
(String response
) { 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");
String errores
= objetoRespuesta.
getString("errores"); int numtotalitems = objetoRespuesta.getInt("numtotalitems");
if (errores.length() == 0) {
if (estatus == true) {
if (peticion.equals("getNumTotalItems")){
Paginator.setTotalNumItems(numtotalitems);
TOTAL_PAGES_FLOAT = (float) TOTAL_NUM_ITEMS / (float) ITEMS_PER_PAGE;
TOTAL_PAGES
= (int) Math.
ceil(TOTAL_PAGES_FLOAT
); ITEMS_EN_LAST_PAGE = TOTAL_NUM_ITEMS % ITEMS_PER_PAGE;
}
else if (peticion.equals("getLibrosForPaginator")) {
String libros
= objetoRespuesta.
getString("libros"); JSONArray jsonArrayLibros = new JSONArray(libros);
for (int k=0; k<jsonArrayLibros.length(); k++) {
Object objetoLibro
= jsonArrayLibros.
get(k
); JSONObject libro = (JSONObject)objetoLibro;
nombreFromJSON
= (String)libro.
get("nombre");
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,