1

Google 的 Android 版 gtalksms 在 Service 中使用了 Handler。当它启动处理程序线程时,它会存储线程 ID,然后在处理程序中进行以下检查:

if (Thread.currentThread().getId() != mHandlerThreadId) {
        throw new IllegalThreadStateException();
}

我的问题是你为什么需要这种类型的检查?这是好习惯还是什么?我对多线程很陌生。

编辑:

为了清楚起见,这是 HandlerThread:

    HandlerThread handlerThread = new HandlerThread("My.Service");
    handlerThread.start();
    mHandlerThreadId = handlerThread.getId();
    ServiceHandler serviceHandler = new ServiceHandler(handlerThread.getLooper());
4

1 回答 1

2

为什么需要这种类型的检查?

该语句确保该方法正在 HandlerThread 上运行。通常,如果对象或进程需要单线程,这是检查对象是否正确使用的一种方法。如果有人从多个线程调用它,则会出现异常。

一个常见的例子是几乎总是意味着单线程的 GUI——一些实现会执行这些类型的检查,以确保您始终从 UI 线程更改 UI 组件。

在这种特定情况下,我不知道该库的详细信息,但我认为它在多线程环境中的行为不符合预期,并且开发人员引入了该检查以禁止此类使用。

注意:从技术上讲,两个线程不太可能具有相同的 ID,但并非不可能,因此检查也可以是:if (Thread.currentThread().equals(handlerThread));

于 2013-05-12T20:35:30.130 回答