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;
}