2010-11-28 14 views
22

Tengo el siguiente:¿cómo puedo pasar una variable a una nueva declaración Runnable?

Runnable done = new Runnable() 
    { 
     public void run() 
     { 
      System.out.println("Hello"); 
     } 
    }; 

Y luego, en mi actividad Android Voy a llamar algo así como:

runOnUIThread(done); 

Que a su vez que llamo. Sin embargo, quiero que "Hello" no esté codificado, así que puedo pasarlo. De lo contrario, tendré que tener una de estas declaraciones para cada cadena que quiero imprimir.

(Esto es en realidad una cuestión androide, pero adelgazó abajo a Java básico por lo que su más fácil de contestar)

Gracias

Respuesta

22
final String hello = whereverItsComingFrom; 
Runnable done = new Runnable() 
    { 
     public void run() 
     { 
      System.out.println(hello); 
     } 
    }; 
+0

No es la mejor manera, ya que, si tiene algo así: pública receivedEvent vacío (e evento) { \t queueEvent (nueva Ejecutable() \t { \t \t public void run() \t \t { \t \t \t System.out.println (e.Message) \t \t} \t}); } Tendrá un error. –

+3

@gtoknu luego simplemente haga el parámetro e final –

+0

¿Hará alguna diferencia tener el parámetro como final? Explica más, por favor! He pensado en reemplazar los métodos que no tienen un parámetro final, debo llamar a otro método que recibe un final y hacer lo que el primer método haría? –

47

En Java (y yo creo que es el mismo en Android también), puedes usar una clase interna anónima, como sugiere Bart van Heukelom. Esta solución tiene la ventaja de tener que escribir menos código, y puede acceder a campos y métodos de la clase externa.

Pero tiene 2 inconvenientes:

  • la variable "hola" tiene que ser definitiva,

  • la clase anónima tiene una referencia interna a la instancia de la clase externa - esto significa que la clase externa retenido cuando de otro modo sería elegible para la recolección de basura. @see: A partir de Java [Joshua Bloch], artículo 22: favor de las clases miembro estáticas no estático sobre

Y en mi humilde opinión, es una mala práctica para parametrizar una instancia de clase de esta manera.

Así que creo que, siempre que 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 de 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); 
    } 
... 
} 
+1

¿Existe una solución multiproceso donde el 'mensaje' no tiene que ser definitivo? –

+0

La declaración 'final' en este ejemplo no es necesaria. - Pero cuando utiliza el Runable en el hilo mutlipe a la vez, ¡tiene que lidiar con problemas de simultaneidad! – Ralph

Cuestiones relacionadas