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?

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

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)

  • Android: Múltiples temporizadores en un ListView con manejador y ejecutables. 2 Problemas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.