我有一個Observable類和一個Observer類。JAVA - Observer永遠不會被通知Runnable
這是一個有點傻,但我可觀察類從來沒有叫我的觀察類的更新(可觀察OBJ,對象ARG)方法的方法notifyObserver(ARG)...
這裏是我的可觀測類:這是從GPS受體
public class GPSFrame extends Observable implements Runnable, SerialPortEventListener
{
static Thread myThread;
private CommPortIdentifier portid=null;
private SerialPort serialport;
private BufferedReader fluxgps; // Reading flow port where the GPS is connected
/** CONSTRUCTOR **/
public GPSFrame()
{
myThread=new Thread(this);
}
public void start()
{
// The thread start automatically run() method
myThread.start();
}
@Override
public void run()
{
try
{
// Driver initialization
Win32Driver driver=new Win32Driver();
driver.initialize();
GPSFrame gpscom=new GPSFrame();
gpscom.listPort();
}
catch (Exception e){ System.out.println("start "+e.toString()); }
}
// Scanning all available ports
public void listPort()
{
Enumeration<?> listport=CommPortIdentifier.getPortIdentifiers();
while(listport.hasMoreElements())
{
portid=(CommPortIdentifier)(CommPortIdentifier)listport.nextElement();
if(portid.getPortType()==CommPortIdentifier.PORT_SERIAL)
{
// On lance la gestion des evenements sur le portid
this.portInitialization(portid.getName());
}
}
}
public void portInitialization(String portcom)
{
// ...
}
public void retrieveGpsFrame()
{
String rawframe=new String();
try
{
rawframe=(String)fluxgps.readLine();
String[]gpsframe=rawframe.split(",");
// We are doing a pre-selection of the frame
if(gpsframe[0].equals("$GPGGA") || gpsframe[0].equals("$GPRMC"))
{
/* IMPORTANT - DON'T FORGET SETCHANGED() or GPSFrame'll never
* notify UPDATE() ServerBoard method - We'll never see any changes */
System.out.println(rawframe);
setChanged();
notifyObservers(rawframe);
}
else
{
gpsframe=null;
}
}
catch (IOException e) { e.printStackTrace(); }
}
}
這裏獲取GPS Frame是我的觀察器類:正在接收和顯示...什麼!
public class ServerBoard extends JFrame implements Observer
{
[...]
// RETRIEVE GPS FRAMES
public void retrieveGPSFrame()
{
gpsframe = new GPSFrame();
gpsframe.addObserver(this);
gpsframe.start();
}
// UPDATE THE JTEXTAREA AND CLIENT
public void update(Observable obj, Object arg)
{
messagearea.append("Affiche moi ce message");
if (arg instanceof String)
{
gpsdata = (String) arg;
System.out.println(gpsdata);
messagearea.append(gpsdata);
tcpserver.sendMessage(gpsdata);
}
}
public void serialEvent(SerialPortEvent event)
{
// Gestion des evenements sur le port
// On ne fait rien sauf quand les donnees sont disponibles
switch(event.getEventType())
{
case SerialPortEvent.DATA_AVAILABLE:
this.retrieveGpsFrame(); // Si les datas sont dispo, on lance la lecture
break;
default:
break; // On ne fait rien sinon
}
}
}
我的logcat沒有錯誤。 當我以調試模式啓動我的應用程序時,它永遠不會經歷更新方法。
你能幫助我嗎?
提前,謝謝。
問候,
Tofuw
和'notifyObservers'被調用? – nachokk
是的,notifyObservers被調用。這部分沒有問題。 – Tofuw