0

我在访问线程中创建的处理程序时有时会出现空指针异常。

我正在使用两种方法。

一种是带线程的服务,我在其中创建处理程序并通过服务方法访问它。其次是在活动中创建的线程,我在其中创建线程,启动它,并创建处理程序。

问题很简单,处理程序是与主线程异步创建的。我在主(gui线程)中访问它,所以有时它会创建,有时它会在获取它时为空。

我可以在 gui 线程上进行 while(handler == null){ } 但这确实是一个糟糕的解决方案。我正在寻找一些优雅的方式来做到这一点。

一切都在主线程中。

Thread t = new Thread(new Runnable {
Looper.prepare();
handler = new Handler();
Looper.Loop();
}
handler.post(new Runnable{}) //at this point sometimes handler is still null. 
and it is created like few ms later. But still at this point i need valid handler
to background thread
4

2 回答 2

0

您可以使用 java 源的并发包。可能的解决方案:

它们为您封装了同步逻辑。

您的代码将类似于:

CyclicBarrier cb = new CyclicBarrier(2);
...
T1:
cb.await();
T2:
cb.await();

CyclicBarrier(或 CountDownLatch)将一直等待,直到给定数量的线程(在本例中为 2)正在等待屏障。

于 2012-04-19T12:36:22.843 回答
0
  1. 除非“hander”属性是 volatile,否则使用 while-loop 或 sleep 不仅不优雅,而且是错误的——即使你发现 handler 不为 null,也不允许使用它。由于写入处理程序和创建处理程序实例之间没有发生之前的关系,主线程可能会在其构造函数运行之前看到对处理程序的引用;

  2. 传递简单引用的安全选择是 SynchronousQueue(它不是真正的队列,它没有内部容量,它只是在线程之间移动对象)。你会像这样使用它(在我看来,一些错别字很可能):


    final SynchronousQueue<Handler> giveMeHandler = new SynchronousQueue();
    new Thread(new Runnable(){
       public void run(){
          Handler handler;
          // create a Handler;
          giveMeHandler.put(handler); // blocks until handler taken;
       }

    }).start();

    Handler handler = giveMeHandler.take(); // blocks until handler given
于 2012-04-19T15:17:06.683 回答