4

これが私のプロセスと問題です:

  1. このアプリケーションでは、メニューボタンをクリックします

  2. このメニューからトグルボタンを押すと、非同期タスクが開始されます(30秒ごとにトーン音が鳴ります)。このタスクは、トグルがチェックされている場合は常に実行され、チェックされていない場合はキャンセルされます。この作業は、メニューウィンドウに留まっている限り、プロセスを開始および停止するのに問題ありません。

  3. トグルボックスをチェックしてください!

  4. ウィンドウがはがされてメニューが再び開かれると、トグルの保存状態がチェックされ、プロセスはまだ実行中です。しかし、私は非同期タスクのそのインスタンスへのアクセスを失ったと思います。トグルのチェックを外すとプログラムがクラッシュするのはなぜですか?
    myTask.cancle(true); 参照が失われたように見える可能性があり、非同期タスクが空中に流れ出て、呼び出したり制御したりすることができなくなりました。

この状況で非同期タスクを取得してキャンセルするにはどうすればよいですか?

TL、DR; 1つのアクティビティから非同期タスクを生成したが(mTask = new ...)、そのアクティビティを終了した場合でも、どうすればmTaskにアクセスできますか?

4

2 に答える 2

0

必要がない場合は、アクティビティが破棄/停止されたらすぐに同期タスクを停止する必要があります。

@Override
public void onStop(){
    mTask.cancel();
}

同期タスクをキャンセルする方法の詳細については、これを参照してください Android - Cancel AsyncTask Forcefully

于 2012-11-11T22:02:18.113 に答える
0

AsyncTaskバックグラウンド スレッドで時間のかかるタスクを実行することを目的としており、終了時または中間結果があるときに UI を更新するためのフックを提供する APIは使用しないでください。

およびシングルトン パターンを使用するだけRunnableで、アクティビティの構築と破棄の間でインスタンスを見つけることができます。のようなもの(簡潔にするために省略されたシングルトンボイラープレート)

public class Player implements Runnable {

  public static void start() {}

  @Override
  public void run() {
    while (alive) {
      playSound();
      sleep();
    }
  }

  public static void stop() {}

  public static boolean isAlive() {}

}

次に、ウィジェットを初期化するとき:

checkbox.setChecked(Player.isAlive());
checkbox.setOnCheckedStateChangeListener(new OnCheckedChangeListener(){
  @Override
  public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    if (isChecked)
      Player.start();
    else
      Player.stop();
  }
});

このようにして、バックグラウンド スレッドは、それを開始したアクティビティから完全に独立しています。

于 2012-11-11T23:45:28.920 に答える