java - termino - ¿Cómo puedo pasar una variable a una nueva declaración de Runnable?
pasar parametros a un hilo java (2)
Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo puedo pasar un parámetro a un subproceso de Java? 17 respuestas
Tengo los siguientes
Runnable done = new Runnable()
{
public void run()
{
System.out.println("Hello");
}
};
Y luego en mi actividad de Android llamaré algo como:
runOnUIThread(done);
Que luego llamo. Sin embargo, quiero que el "Hello"
no esté codificado, por lo que puedo pasarlo. De lo contrario, tendré que tener una de estas declaraciones para cada cadena que quiero imprimir.
(Esto es en realidad una pregunta de Android, pero se redujo a Java básico, por lo que es más fácil de responder)
Gracias
En Java (y creo que también es lo mismo en Android), puedes usar una clase interna anónima, como lo sugiere Bart van Heukelom. Esta solución tiene la ventaja de que tiene que escribir menos código, y podría acceder a los campos y métodos de la clase externa.
Pero tiene 2 inconvenientes:
La variable "hola" tiene que ser final,
la clase anónima tiene una referencia interna a la instancia de la clase externa; esto significa que la clase externa se retiene cuando de lo contrario sería elegible para la recolección de basura. @Ver: Java efectivo [Joshua Bloch], punto 22: favorecer las clases miembro estáticas en lugar de las no estáticas
Y en mi humilde opinión, es una mala práctica parametrizar una instancia de clase de esta manera.
Así que creo que, mientras no necesite acceder a los métodos y campos de la clase externa, es mejor escribir una clase específica para esta tarea y convertirla en una clase miembro estática .
class Demo {
...
private static class MyRunnable implements Runnable {
private final String message;
MyRunnable(final String message) {
this.message = message;
}
public void run() {
System.out.println(message);
}
}
public void startThread() {
MyRunnable myRunnable = new MyRunnable("Hello");
runOnUIThread(myRunnable);
}
...
}
final String hello = whereverItsComingFrom;
Runnable done = new Runnable()
{
public void run()
{
System.out.println(hello);
}
};