2012-03-04 13 views
5

El controlador en Android se utiliza para enviar mensajes entre clases. Por ejemplo:¿Hay alguna clase en Java similar a android.os.Handler en Android?

public class Foo 
{ 

    private Handler handler; 

    public Foo(Handler handler) 
    { 
     this.handler = handler; 

     // ... 
    } 

    public void fooMethod() 
    { 
     // ... 
     handler.obtainMessage("blah blah").sendToTarget(); 
    } 

} 

principal:

public class Main 
{ 
    private Handler handler; 

    public Main() 
    { 
     handler = new Handler() 
     { 
      @Override 
      public void handleMessage(Message msg) 
      { 
       // handle the message that is sent from Foo 
      } 
     }; 

     Foo f = new Foo(handler); 

     // ... 
    } 
} 

Así, Busco a una técnica similar en Java, o debo aplicar mi propio manejador?

+3

'Handler' está diseñado principalmente para permitir que los hilos de fondo puedan organizar el trabajo en la cadena principal de la aplicación (por ejemplo, actualizaciones de la interfaz de usuario). O, para citar [la documentación] (http://developer.android.com/reference/android/os/Handler.html), "Hay dos usos principales para un Manejador: (1) para programar mensajes y ejecutables para que sean ejecutado como un punto en el futuro, y (2) para poner en cola una acción que se realizará en un hilo diferente al suyo ". Usar un 'Handler' para otros fines es una práctica deficiente. – CommonsWare

+0

@CommonsWare Gracias por el consejo. Solo quiero usar el mecanismo que se usa en Handler (es decir, quiero redirigir un mensaje de socket que viene a través de Internet a través de la clase 'Foo', y usarlo en la clase' Main'). –

+0

La mayoría de los desarrolladores de OO simplemente llaman a un método en 'Main' desde una instancia de' Foo'. – CommonsWare

Respuesta

2

no hay uno por defecto. Pero puedes hacer tu propia clase personalizada que haga algo similar. hice uno como este:

import java.util.ArrayList; 

public class Handler extends Object{ 

ArrayList<Message> messages; 

public Handler(){ 
    messages = new ArrayList<>(); 
} 

public final Message obtainMessage(int what, Object obj){ 
    Message message = new Message(what, obj, this); 
    messages.add(message); 
    return message; 
} 

public final Message obtainMessage(int what){ 
    Message message = new Message(what, this); 
    messages.add(message); 
    return message; 
} 

public void handleMessage(Message msg){ 
    messages.remove(msg); 
} 

public final boolean hasMessages(){ 
    return !messages.isEmpty(); 
} 
} 

entonces también tendría una clase personalizada mensaje como este:

public class Message extends Object{ 

int mWhat; 
Object mObj; 
Handler mTarget; 

public Message(int what, Object obj){ 
    mWhat = what; 
    mObj = obj; 
} 

public Message(int what, Object obj, Handler target){ 
    mWhat = what; 
    mObj = obj; 
    mTarget = target; 
} 

public Message(int what, Handler target){ 
    mWhat = what; 
    mTarget = target; 
} 

public Message(int what){ 
    mWhat = what; 
} 

public void sendToTarget(){ 
    mTarget.handleMessage(this); 
} 
} 

Puede utilizar este controlador para comunicarse desde un subproceso de fondo para el hilo de interfaz de usuario, sin perturbar demasiado el hilo de UI.

Puede utilizar esta clase por completo de la misma manera que lo haría en Android: En primer lugar se crea una instancia de la clase de interfaz de usuario:

final int MESSAGE_RECEIVED = 0; 
Handler handler = new Handler(){ 
    @Override 
    public void handleMessage(Message msg) { 
     super.handleMessage(msg); 
     switch (msg.mWhat){ 
      case MESSAGE_RECEIVED: 
       System.out.println("Message received."); 
       updateStatus("Message received."); 
       break; 
     } 
    } 
}; 

Entonces suministrar este caso Handler a su subproceso de fondo:

Thread thread = new T1(handler); 
thread.start(); 

Y por último, se envían mensajes por medio de:

mHandler.obtainMessage(0).sendToTarget(); 

Probé este método en un programa de applet de muestra que hice, y parece funcionar perfectamente. Aunque no soy un experto programador de Java, podría haber algunas desventajas en esto, que realmente no conozco. Si es así, me encantaría escuchar una explicación educada de por qué esto no está bien.

Espero que esto ayude a alguien.

NOTA: Las clases de Controlador y Mensaje anteriores (mi código) no proporcionan la funcionalidad completa de Android.Handler y Android.Message.

+1

Este no es realmente el comportamiento esperado. En Android, handleMessage se ejecutará en el subproceso donde se creó el controlador (porque Handler está limitado al subproceso donde se creó. Aunque parezca que el uso es similar, el ejemplo que propones se ejecutará diferente del Handler de Android ¡Más explícito, la parte del código de handleMessage se ejecutará en el hilo (T1) no en el hilo donde se creó el controlador! –

Cuestiones relacionadas