我遇到的问题是,一个线程在初始化其处理程序之前尝试将消息发送到另一个线程的处理程序。这种异步线程通信很容易导致nullpointerexception。
我正在尝试使用以下代码来修复此问题(等待通知算法)但我不明白如何从我的线程发送消息调用getHandler()因为我不断得到“非静态方法不能从静态上下文中调用“错误。
尝试修复消息接收线程的代码:
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()方法?
背景资料:
我使用了这个问题和其中一个答案作为参考:How do I ensure another Thread's Handler is not null before calling it?
答案 0 :(得分:1)
错误Non-static method cannot be called from a static context
的含义是您尝试以静态方式使用非静态(类成员)(在您的示例中,引用LooperThread
)。修复通常是为了使方法处于故障状态,例如, public static synchronized Handler getHandler()
。
在您的情况下,您使用的是wait()
,这是一种非静态方法(因此无法从静态上下文访问)。相反,您应该将mHandler
更改为非静态状态(因此每个线程会有mHandler
- 这就是您想要的):private Handler mHandler;
在SenderThread
内,你需要构建一个LooperThread
,然后你可以调用它的非静态getHandler()
。
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();
}
}