gpt4 book ai didi

java - 如何从另一个线程调用一个线程的 getHandler() 方法?

转载 作者:行者123 更新时间:2023-11-30 01:42:48 24 4
gpt4 key购买 nike

我遇到了这样一个问题:一个线程试图在另一个线程的处理程序初始化之前将消息发送到另一个线程的处理程序。这种异步线程通信很容易导致空指针异常。

我正在尝试使用以下代码来解决此问题(一种等待通知算法),但我不明白如何从发送消息的线程中调用 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?

最佳答案

错误 Non-static method cannot be called from a static context 的含义是您正试图以静态方式使用非静态(类成员)(在您的示例中,引用 LooperThread)。修复通常是使故障方法静态化,例如public static synchronized Handler getHandler().

然而,在您的情况下,您使用的是 wait() ,这是一种非静态方法(因此无法从静态上下文访问)。相反,您应该将 mHandler 更改为非静态状态(因此会有一个 mHandler per thread - 这就是您想要的):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();
}
}

关于java - 如何从另一个线程调用一个线程的 getHandler() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34216419/

24 4 0