2014-01-20 118 views
0

我已經使用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); 

} 
} 
+0

什麼是在Java中實例化偵聽器的正確或標準方法? – Kevik

+0

當使用android我會做的onAttach方法的一個片段,但不知道最好的方法來做到這一點 – Kevik

+0

你的程序不會死在新的SendMessageClass()後? – ikh

回答

0

看起來您需要在打開定時器之前調用「SetOnStringRequestedListener」。實際上,該方法永遠不會被調用,並且onStringListener永遠不會被設置。你確實在接收器中調用了這一行代碼,但當然它太遲了。你的主要應該立即對接收者和發送者SetOnStringRequestedListener進行消毒,然後設置定時器。

SendMessageClass send = new SendMessageClass(); 
ReceiveMessageClass recv = new ReceiveMessageClass() 
send.SetOnStringRequestedListener(recv) 

編輯:然後取出在引用發件人接收機的任何代碼。使用聽衆背後的想法是,兩個類不直接瞭解對方。

+0

謝謝,它現在可行。我也從主要方法啓動了計時器。 Java和Android必須以不同的方式接近。 – Kevik

相關問題