我已经在Android上使用了侦听器,但从未遇到任何问题,但是今天,当它尝试在Java中创建一个简单的侦听器时,我收到NullPointerException,这是什么原因造成的,我该如何解决?
这包括3个类,ListenerMainStart.java,SendMessageClass.java和ReceiveMessageClass.java
ListenerMainStart.java
public class ListenerMainStart {
public static void main(String[] args) {
new SendMessageClass();
}
}
SendMessageClass.java
public class SendMessageClass {
public OnStringRequestedListener onStringListener;
public Timer timer;
public SendMessageClass() {
timer = new Timer();
timer.schedule(new TimerAction(), 3000);
}
public void SetOnStringRequestedListener(OnStringRequestedListener listener) {
System.out.println("value of onStringListener " + onStringListener.toString());
onStringListener = listener;
}
public interface OnStringRequestedListener {
public void passString(String sendString);
}
public class TimerAction extends TimerTask {
@Override
public void run() {
if (onStringListener!=null){
// pass string to other class, ONSTRINGLISTENER IS ALWASY NULL
onStringListener.passString("string sent from SendMessageclass");
} else {
System.out.println("onStringListener is null");
}
}
}
}
ReceiveMessageClass.java
public class ReceiveMessageClass implements SendMessageClass.OnStringRequestedListener {
SendMessageClass senderClass;
public ReceiveMessageClass() {
// instantiate class
senderClass = new SendMessageClass();
// set the listener to the class
senderClass.SetOnStringRequestedListener(this);
}
@Override
public void passString(String sendString) {
// do action when string is sent from other class
System.out.println("message recevied from other class is " + sendString);
}
}
最佳答案
看来您需要在打开计时器之前调用“ SetOnStringRequestedListener”。实际上,该方法永远不会被调用,并且onStringListener也永远不会被设置。您确实在接收器中调用了该行代码,但是当然在那儿太晚了。您的主体应实例化接收方和发送方SetOnStringRequestedListener,然后关闭计时器。
SendMessageClass send = new SendMessageClass();
ReceiveMessageClass recv = new ReceiveMessageClass()
send.SetOnStringRequestedListener(recv)
编辑:然后取出引用发送者的接收者中的所有代码。使用监听器的想法是,这两个类彼此之间并不直接了解。