Asegúrese de que mi código es seguro para hilos
Estoy haciendo un servicio de Android que ofrece contenido a otras aplicaciones que pueden registrarse como devolución de llamada.
No estoy 100% seguro de cómo funciona la clase de controlador de Android, así que alguien puede confirmarme que este código es seguro para subprocesos?
- Actualización de la interfaz de usuario con Runnable y postDelayed no funciona con la aplicación de temporizador
- Cómo hacer tostadas de otro hilo (sans runOnUiThread)
- ¿Por qué usar HandlerThread en Android?
- Java.lang.RuntimeException: Handler (android.os.Handler) envío de mensajes a un Handler en un hilo muerto
- Android - Menú Opciones no funcionará
public class MyService extends Service { private static final String MESSAGE = "message"; private final RemoteCallbackList<IMyCallback> readerCallbacks = new RemoteCallbackList<IMyCallback>(); private static final int REPORT_MSG = 1; private Thread readerThread; @Override public void onCreate() { readerThread = new Thread(readerRunnable); readerThread.setDaemon(true); readerThread.start(); } private Runnable readerRunnable = new Runnable() { @Override public void run() { while (!Thread.interrupted()) { // Blocking call byte[] message = JniCommunicator.readMessage(); if (message == null || message.length == 0) { continue; } Bundle b = new Bundle(); b.putByteArray(MESSAGE, message); Message m = readHandler.obtainMessage(REPORT_MSG); m.setData(b); readHandler.sendMessage(m); } } }; private final Handler readHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case REPORT_MSG: byte[] message = msg.getData().getByteArray(MESSAGE); // Broadcast the new message to all clients final int N = readerCallbacks.beginBroadcast(); for (int i = 0; i < N; i++) { try { readerCallbacks.getBroadcastItem(i).newMessage(message); } catch (RemoteException e) { // The RemoteCallbackList will take care of removing // the dead object for us. } } readerCallbacks.finishBroadcast(); break; } } }; @Override public IBinder onBind(Intent intent) { return mBinder; } private final IService.Stub mBinder = new IService.Stub() { public void registerCallback(IMyCallback cb) { if (cb != null) readerCallbacks.register(cb); } public void unregisterCallback(IMyCallback cb) { if (cb != null) readerCallbacks.unregister(cb); } }; }
En particular, si alguien llama a unregisterCallback () mientras el Handler está en el bucle for, ¿se bloqueará?
Desde mi entendimiento, el manejador ejecutar en el mismo hilo, por lo que es hilo seguro, pero no estoy seguro.
Gracias
- Timertask o manejador
- Completion Handlers en Android
- Cómo devolver un resultado a través de múltiples actividades
- Despido de ProgressDialog en android
- ¿Por qué getHandler () devuelve null?
- ¿Cómo utilizar los controladores?
- Android: Llamar a métodos no estáticos desde una clase de controlador estático
- Error de Eclipse dando "excepción de bucle de evento no controlado" No más identificadores
Los manejadores son hilos seguros, que es su propósito entero.
Estoy de acuerdo en que la documentación sobre el hilo de seguridad de los manejadores no es la mejor, pero sería muy irónico si una clase diseñada para comunicarse entre el hilo no eran hilos seguros.
Acerca de las devoluciones de llamada remotas, también están diseñados para ser hilo seguro, usted debe leer la documentación sobre esto, se indica claramente:
Realiza el bloqueo de la lista subyacente de interfaces para hacer frente a las llamadas entrantes con subprocesos múltiples y una forma segura de subprocesamiento de iterar sobre una instantánea de la lista sin mantener su bloqueo
Todo lo que tiene que asegurarse es que todas las variables de acceso de hilos múltiples son hilos seguros (que están en su caso) y que no se están cambiando (el suyo es final por lo que no hay preocupaciones tampoco)
- Establecer desvanecimiento de texto en Android 4.0.3
- Android ProGuard + MultiDex causa ClassNotFoundException