0

ユーザーが画面上のボタンをクリックするまでしばらくループしてネットワークからデータを取得し、データの受信を停止して別のアクティビティを表示したいと考えています。私が受け取るために行うことは次のとおりです。

Thread listUpdater;

...

listUpdater = new Thread() {
    @Override
    public void run() {
        TimerTask task = new UpdateListTask();

        while (true) {
            task.run();
        }
    }
};
listUpdater.start();

...

public class UpdateListTask extends TimerTask {

     public UpdateListTask() {
     }

     @Override
     public void run() { 
        // get some data from network (asynchronically)
     }
}

ユーザーがボタンをクリックしたら、次のコードを実行します。

try {
    listUpdater.join();
} catch (InterruptedException e) {
    e.printStackTrace();
}

しかし、それは新しいスレッド/タイマー タスクの実行ループを停止しません。すべてのコードがまだ実行されています。これは望ましくありません。コードの実行を停止するにはどうすればよいですか? スレッドを停止する方法はありますか? または、while ループを停止するためにスレッド間ブール変数の設定を行うことはできますか?

私はすべてを試しましたが、成功しませんでした。誰でも助けてもらえますか?

4

1 に答える 1

1

.join は、スレッドが終了するまで待機します。あなたのスレッドは決して終わらないので、すべてが壊れます。

スレッドを実際に停止する簡単な方法は次のとおりです。

volatile boolean updateList;
Thread listUpdater;

...

listUpdater = new Thread() {
    @Override
    public void run() {
        TimerTask task = new UpdateListTask();

        while (updateList) {
            task.run();
        }
    }
};
updateList = true;
listUpdater.start();

try {
    updateList = false;
    listUpdater.join();
} catch (InterruptedException e) {
    e.printStackTrace();
}

このように、boolean 変数をフラグとして使用して、listUpdater スレッドの実行を制御します。スレッドを再起動するたびに、忘れずに true に戻してください。

于 2013-01-27T23:20:20.473 に答える