Java 如何调用线程';从另一个线程获取的getHandler()方法?
我遇到了一个问题,一个线程试图在另一个线程的处理程序初始化之前将消息发送给另一个线程的处理程序。这种异步线程通信很容易导致nullpointerexception 我正试图使用以下代码来修复此问题(等待通知算法),但我不知道如何从发送消息的线程调用getHandler(),因为我一直遇到“无法从静态上下文调用非静态方法”错误 试图修复消息接收线程的代码:Java 如何调用线程';从另一个线程获取的getHandler()方法?,java,android,multithreading,handler,Java,Android,Multithreading,Handler,我遇到了一个问题,一个线程试图在另一个线程的处理程序初始化之前将消息发送给另一个线程的处理程序。这种异步线程通信很容易导致nullpointerexception 我正试图使用以下代码来修复此问题(等待通知算法),但我不知道如何从发送消息的线程调用getHandler(),因为我一直遇到“无法从静态上下文调用非静态方法”错误 试图修复消息接收线程的代码: public class LooperThread extends Thread { private static Handler
public class LooperThread extends Thread {
private static Handler mHandler;
public void run() {
Looper.prepare();
synchronized (this) {
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
notifyAll();
}
Looper.loop();
}
public synchronized Handler getHandler() {
while (mHandler == null) {
try {
wait();
} catch (InterruptedException e) {
//Ignore and try again.
}
}
return mHandler;
}
}
当我尝试下面的代码时,我一直得到“无法从静态上下文编译器错误调用非静态方法”
消息发送线程:
public class SenderThread extends thread{
private static Handler senderHandler;
public void run(){
Looper.prepare();
senderHandler = LooperThread.getHandler(); //This is where the error occurs!
//do stuff
senderHandler.msg(obj);
Looper.loop();
}
}
我知道我可能不应该尝试从run()方法中初始化发送方线程的处理程序,因为它会被重复调用,因此会造成浪费。我应该从哪里调用LooperThread的getHandler()方法?
背景资料:
我使用这个问题和其中一个答案作为参考:错误
非静态方法不能从静态上下文调用的含义是,您试图以静态方式使用非静态(类成员)(在您的示例中,指的是LooperThread
)。此修复通常是使出现故障的方法成为静态的,例如,公共静态同步处理程序getHandler()
但是,在您的情况下,您使用的是非静态方法wait()
(因此无法从静态上下文访问)。相反,您应该将mHandler
更改为非静态状态(因此每个线程将有一个mHandler
,这就是您想要的):私有处理程序mHandler;
在SenderThread
内部,您需要构造一个LooperThread
,然后可以调用它的非静态getHandler()
谢谢。不过我很好奇:有没有一种方法可以在不从SenderThread构造LooperThread的情况下实现这个功能?目前我从主线程(在Android设备上称为“UI线程”)创建两个线程,如果可能的话,我希望保持这种方式。
public class SenderThread extends Thread {
private static Handler senderHandler;
public void run(){
Looper.prepare();
LooperThread looperThread = new LooperThread();
senderHandler = looperThread.getHandler(); // Should no longer error :-)
//do stuff
senderHandler.msg(obj);
Looper.loop();
}
}