Tôi đang làm một dịch vụ Android cung cấp nội dung cho các ứng dụng khác có thể đăng ký dưới dạng gọi lại.Đảm bảo rằng mã của tôi là an toàn chủ đề
Tôi không chắc chắn 100% về cách hoạt động của lớp Trình xử lý Android, vì vậy ai đó có thể xác nhận rằng mã này là chuỗi an toàn?
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);
}
};
}
Cụ thể, nếu người nào đó gọi unregisterCallback() trong khi Trình xử lý đang trong vòng lặp, nó có bị lỗi không?
Từ hiểu biết của tôi, Trình xử lý chạy trong cùng một chuỗi, vì vậy nó là luồng an toàn, nhưng tôi không chắc chắn.
Cảm ơn
Nên bật: http://codereview.stackexchange.com/ –