0

androidでrunnableタスクの定期実行をhandlerを使って作成したのですが、その定期タスク実行で引数を渡したい、引数を渡す方法を2つ試してみましたが、

1 - メソッドでクラスを宣言する

void Foo(String str) {
    class OneShotTask implements Runnable {
        String str;
        OneShotTask(String s) { str = s; }
        public void run() {
            someFunc(str);
        }
    }
    Thread t = new Thread(new OneShotTask(str));
    t.start();
}

2 - そしてそれを関数に入れて

String paramStr = "a parameter";
Runnable myRunnable = createRunnable(paramStr);

private Runnable createRunnable(final String paramStr){

    Runnable aRunnable = new Runnable(){
        public void run(){
            someFunc(paramStr);
        }
    };

    return aRunnable;

}

上記の 2 つのアプローチのリファレンスは、Runnable with a parameter? にあります。

以下は、1 のアプローチを使用したコードですが、1 または 2 のアプローチを使用すると、周期的な実行可能なタスクで引数を渡すことによって残る 2 つの問題があります。

1 つの問題 - クラス内のカウンター変数は、コードが繰り返されるたびに上書きされます。クラスとメソッドの外でこのカウンター変数をローカル変数ではなくグローバル変数として定義すると、正常に機能しますが、それは私の要件ではありません。

2 つの問題 - カウンター変数をグローバル変数として使用することで 1 つの問題が解決され、最初の実行後にカウンターがインクリメントし、2 回目の実行でセンサー (mSensorListener) の登録が解除されたが、このコマンドでさらにコールバックを削除できないと仮定します

// Removes pending code execution
staticDetectionHandler.removeCallbacks(staticDetectionRunnableCode(null));

上記のコマンドは onPause メソッドでも機能しませんが、このコマンドの実行後も定期的に実行されますか? 何が起こっているのか理解できません。誰かがこれに対する解決策を提供できますか? 以下は私のコードです、

Runnable staticDetectionRunnableCode(String str){

    class staticDetectionRunnableClass implements Runnable{
        String str;
        private int counter = 0;

        staticDetectionRunnableClass(String str){
            this.str = str;
        }

        @Override
        public void run() {
            // Do something here
            Log.e("", "staticDetectinoHandler Called");

            Debug.out(str + " and value of " + counter);

            // Repeat this runnable code block again every 5 sec, hence periodic execution...
            staticDetectionHandler.postDelayed(staticDetectionRunnableCode(str), constants.delay_in_msec * 5);  // for 5 second

            if(counter >= 1){
                // Removes pending code execution
                staticDetectionHandler.removeCallbacks(staticDetectionRunnableCode(null));

                // unregister listener
                mSensorManager.unregisterListener(mSensorListener);
            }
            counter++;
        }
    }

    Thread t = new Thread(new staticDetectionRunnableClass(str));
    return t;
}
4

0 に答える 0