Убедитесь, что мой код безопасен для потоков

Я делаю Android сервис, который предоставляет контент другим приложениям, которые могут зарегистрироваться в качестве обратного вызова.

Я не уверен на 100% в том, как работает класс Android Handler, поэтому может ли кто-нибудь подтвердить мне, что этот код является потокобезопасным?

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);
        }
    };
}

В частности, если кто-то вызовет unregisterCallback(), пока Handler находится в цикле for, произойдет ли сбой?

Насколько я понимаю, Handler работает в том же потоке, поэтому он потокобезопасен, но я не уверен.

Спасибо

6
задан Jonas 6 October 2011 в 16:40
поделиться