在访问在线程中创建的处理程序时,有时会得到空指针异常。
我使用两种方法。
一个是带线程的服务,我在其中创建处理程序并通过服务方法访问它。 第二个是在活动中创建的线程,其中我正在制作线程,启动它,并制作处理程序。
问题很简单,处理程序是与主线程异步创建的。我在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
答案 0 :(得分:0)
您可以使用java源的并发包。 可能的解决方案:
他们为您封装了同步逻辑。
您的代码将类似于:
CyclicBarrier cb = new CyclicBarrier(2);
...
T1:
cb.await();
T2:
cb.await();
CyclicBarrier(或CountDownLatch)将等待,直到给定数量的线程(在这种情况下为2)正在等待屏障。
答案 1 :(得分:0)
除非“hander”属性是易变的,否则使用while循环或休眠不仅不优雅,而且错误 - 即使您发现处理程序不为null,也不允许使用它。由于写入处理程序和创建hander实例之间没有发生之前的关系,因此主线程可能会看到对处理程序BEFORE ITS CONSTRUCTOR运行的引用;
交出简单引用的安全选择是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