1

画面がオンになるたびに実行されるサービスがあります。電話をスリープ状態にすると、サービスとスレッドが停止するはずです。

なんとかサービスを停止できましたが、スレッドはまだ実行されています。どうすればスレッドを強制終了できますか?

void runAppCheck(){
    new Thread(new Runnable() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            while (true) {
                try {
                    Thread.sleep(10000);
                    mHandler.post(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            getForegroundApplication();
                            compareResults();
                            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
                            boolean screenIsOn = pm.isScreenOn();
                            if (!screenIsOn) {
                                Log.i(TAG ,"Screen is OFF, stopping service");
                                stopSelf();
                                //TODO stop thread
                            }
                        }
                    });
                } catch (Exception e) {
                    // TODO: handle exception
                }
            }
        }
    }).start();
4

2 に答える 2

1

を停止するThreadように要求するフラグとして機能する共有変数を使用して、Threadを停止できます。たとえば、アウターで、アウターThreadを宣言しprivate volatile boolean mRunning = trueてからに変更while(true)while(mRunning)ます。次に、実行を停止するように要求するメソッドを実装します。

public void terminate() {
    mRunning = false;
}
于 2013-03-11T18:53:15.687 に答える
0

何かが足りない場合を除いて、答えは非常に簡単なように思われるので、私はあなたの問題を完全には理解していません。

例でスレッドを停止するのは、を呼び出すのと同じくらい簡単なようですreturn;。これにより、public void run()メソッドが終了し、スレッドが終了します。

      ....
                       if (!screenIsOn) {
                            Log.i(TAG ,"Screen is OFF, stopping service");
                            stopSelf();
                            return;
                        }
      ....

OPのコメント後に更新:

を使用しておらずAlarmManager、スレッドがまだCPUサイクルを受信して​​いることを確認できる場合は、なぜmHandler.post(....)呼び出しを行うのですか?postその呼び出しをスキップしてみませんか。

void runAppCheck(){
new Thread(new Runnable() {
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while (true) {
            try {
                Thread.sleep(10000);
                        // TODO Auto-generated method stub
                        getForegroundApplication();
                        compareResults();
                        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
                        boolean screenIsOn = pm.isScreenOn();
                        if (!screenIsOn) {
                            Log.i(TAG ,"Screen is OFF, stopping service");
                            stopSelf();

                            //stop thread
                            return;
                        }
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
    }
}).start();
于 2013-03-11T19:32:06.600 に答える