gpt4 book ai didi

android - 确保我的代码是线程安全的

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:01:54 25 4
gpt4 key购买 nike

我正在做一项 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);
}
};
}

特别是当Handler在for循环中的时候有人调用unregisterCallback()会不会崩溃?

据我了解,Handler 运行在同一个线程中,因此它是线程安全的,但我不确定。

谢谢

最佳答案

Handlers是线程安全的,这是它们的全部目的。
我同意有关处理程序线程安全的文档不是最好的,但如果设计用于线程间通信的类不是线程安全的,那将是非常具有讽刺意味的。

关于远程回调,它们也被设计成线程安全的,你应该阅读the documentation对此,它明确指出:

Performs locking of the underlying list of interfaces to deal with multithreaded incoming calls, and a thread-safe way to iterate over a snapshot of the list without holding its lock

所有你需要确保的是多线程访问的所有变量都是线程安全的(在你的情况下是这样)并且它们没有被改变(你的是最终的所以不用担心)

关于android - 确保我的代码是线程安全的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7677640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com