同步处理程序创建和访问

时间:2012-04-19 10:05:30

标签: java android multithreading handler

在访问在线程中创建的处理程序时,有时会得到空指针异常。

我使用两种方法。

一个是带线程的服务,我在其中创建处理程序并通过服务方法访问它。 第二个是在活动中创建的线程,其中我正在制作线程,启动它,并制作处理程序。

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

我可以在gui线程上做(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

2 个答案:

答案 0 :(得分:0)

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

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

您的代码将类似于:

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

CyclicBarrier(或CountDownLatch)将等待,直到给定数量的线程(在这种情况下为2)正在等待屏障。

答案 1 :(得分:0)

  1. 除非“hander”属性是易变的,否则使用while循环或休眠不仅不优雅,而且错误 - 即使您发现处理程序不为null,也不允许使用它。由于写入处理程序和创建hander实例之间没有发生之前的关系,因此主线程可能会看到对处理程序BEFORE ITS CONSTRUCTOR运行的引用;

  2. 交出简单引用的安全选择是SynchronousQueue(它实际上不是一个队列,它没有内部容量,它只是在线程之间移动一个对象)。你会像这样使用它(我的头脑,一些错字很可能):

  3. 
        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