0

我在一个 android 项目中使用 Handler 来给 main/ui 线程一个回调。

        if (mHandler == null) {
            mHandler = new Handler(Looper.getMainLooper());
        }
        mHandler.post(new Runnable() {
            public void run() {
                freeBeePlaybackEventListener.onError(freeBeeError);
            }
        });

当我创建处理程序对象即 mHandler 时,我正在检查处理程序是否已经存在。如果没有,那么我正在创建处理程序,即使用单例模式。我的问题是:创建处理程序对象线程安全吗?

谢谢。

4

2 回答 2

3

不,这段代码不是线程安全的。

但问题不在于 Handler 本身,而在于使用的创建模式。如果您在此处报告的代码同时被两个不同的线程调用,则可能会发生关键竞争,即创建两个不同的对象(在本例中为 Handler)。如果您确定此代码始终由同一个线程调用,则可以安全地使用它。

顺便说一下,这和懒惰的Singleton创建是一样的问题,通常是这样解决的:

if( mHandler == null )
{
    syncronized( this )
    {
        if( mHandler == null )
            mHandler = new Handler(Looper.getMainLooper());
    }
}

其中“this”是一个同步对象,可能是类容器或其他任何东西。

于 2018-08-08T17:31:18.823 回答
0

句柄是线程安全的。

要处理与工作线程的更复杂的交互,您可能会考虑在工作线程中使用 Handler 来处理从 UI 线程传递的消息。(DOC-Worker 线程

通常,您为新线程创建 Handler,但您也可以创建连接到现有线程的 Handler。当您将 Handler 连接到 UI 线程时,处理消息的代码将在 UI 线程上运行(Android 文档

于 2016-11-30T20:01:18.787 回答