0

checkUpdateこのメソッド内に呼び出されるスレッドがあります。

public void onLocationChanged(Location location)
    checkUpdate = new Thread() {
        public void run() {
          try {
               // do some long staff using location variable            
              } catch (Exception e) {}
          handler.sendEmptyMessage(0);
        }
     };
    checkUpdate.start();

問題はonLocationChanged()、スレッドが終了する前にメソッドがシステムによって呼び出されることです。これにより、アプリケーションで予期しない動作が発生します。

すでに実行されている場合など、スレッドを実行しない方法はありますか?


解決:

私は何が起こっているのか知っています、あなたはあなたの破壊活動を呼び出しlocationManager.removeUpdates(locationListener); て設定する必要がありlocationManager=nullます、さもなければアプリが閉じられても、サービスはまだ実行されて場所を取得しています。

4

1 に答える 1

1

スレッドが既に実行されている場合、または同様のスレッドを実行しない方法はありますか

を使用しAtomicBooleanて、スレッドを開始するかどうかを示す値を設定できます。次に、run()メソッドの最後で、フラグを false にリセットできます。

次のようなものが機能するはずです。

private final AtomicBoolean threadStarted = new AtomicBoolean(false);
...
public void onLocationChanged(Location location) {
    if (threadStarted.compareAndSet(false, true)) {
        // start the thread
        checkUpdate = new Thread() {
            public void run() {
                try {
                    // do thread stuff here
                } finally {
                    // when the thread finishes, set the started flag to false
                    threadStarted.set(false);
                }
            }
        };
        checkUpdate.start();
    }
}
于 2012-07-26T19:03:59.923 に答える