スタンドアロンで動作するメソッド myFuncs.requestData() があります。データをリッスンするためにサブスクライブし、リスナーがすべてのデータを受信したときに ReadyTxt="TRUE" を設定します。これは複数のコールバックで行われます。
しかし、ボタンにアタッチされている actionPerformed メソッド内で DataReady をチェックしようとすると、設定されていません。なぜなら、myFuncs.requestData() は actionPerformed から抜けた後にのみ処理/実行されるように見えるからです。
「スタンドアロン」とは、##HERE## に関数を配置しない場合、actionPerformed が完了した後に requestData() が機能することを意味します。
実行されていることを確認し、##HERE## の時点で終了するのを待つにはどうすればよいですか?
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
writePaneln("BUTTON PRESSED "+myFuncs.ReadyTxt);
myFuncs.requestData();
try {
Thread.currentThread().sleep(5000);
} catch (InterruptedException e) {
}
writePaneln("REQUESTED "+myFuncs.ReadyTxt);
##HERE##
}
スレッドバージョン:
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
writePaneln("BUTTON PRESSED "+myFuncs.ReadyTxt);
Thread thread = new Thread() {
public void run(){
myFuncs.requestData();
}
};
thread.start();
try {
Thread.currentThread().sleep(5000);
} catch (InterruptedException e) {
}
writePaneln("REQUESTED "+myFuncs.ReadyTxt);
##HERE##
}
簡略化された requestData():
public void requestData() {
DataReady="FALSE"
this.dataSubscription.setListener(this);
}
@Override
public void dataUpdated(List<long> updatedData) {
if (updatedData.size() <= 1 ){
this.dataSubscription.destroy();
writePaneln("In dataUpdated DataReady num: "+Dates.size());
DataReady="TRUE";
return;
}
for (long l: updatedData){
writePaneln(l);
Dates.add(l);
}
}