質問: * WifiManagerからRSSIの値を取得し、5秒平均の値を$hogeとし * $hogeに自動的にアクセス (RSSIの平均が40であれば、=40にアクセス) これを10秒毎に繰り返すアプリを作りたいです。 ・URLの引数部分を生成するにはどうすればよいでしょうか ・定期的に処理を実行し、HTTPでPostリクエストを飛ばすにはどうすればよいでしょうか。 WebViewで、web.loadUrl("$hoge")として 10秒毎にリロードするのがよいでしょうか? サーバ側で、受け取った値に応じて、その場で外部機器を自動操作する用途で使います。 数秒程度のズレが生じても、特に問題はありません。
回答: URLの引数部分は単に+演算子を使えばよいです。 ``` "http://localhost/index.php?SigStrength=" + hoge ``` 定期実行には`java.util.Timer`を使います。`timer.schedule(task, 0, 10000)`などと呼び出せばtaskが10000ミリ秒間隔で0ミリ秒後から実行されます。 HTTP接続には`java.net.URL`を作成し、`url.openConnection()`で`java.net.HttpURLConnection`を作って接続設定を行い、リクエストを送信します。 纏めると以下のような感じでしょうか。信号強度のサンプリング方法は毎秒一回値を取得することを想定したコードになっています。 ``` private Timer timer; private void start() { // タイマーの初期化 if (timer == null) { timer = new Timer(); timer.schedule(new TimerTask() { // タイマーの実行回数 private int i; // 信号強度の合計 private double sum; private double getStrength() { // 信号強度の取得は未実装 throw new RuntimeException(); } // タイマー実行時に呼び出されるメソッド // 1秒間隔で信号強度を取得し、10回に1回送信を行う @Override public void run() { try { // 実行回数が5, 15, 25, 35...であれば送信 if (++i % 10 == 5) { // URLの生成部分 URL url = new URL( "http://localhost/index.php?SigStrength=" + Math.round(sum / 5)); HttpURLConnection cn = (HttpURLConnection) url.openConnection(); // POSTの場合 // 上でGETパラメーターを設定しているので不要? cn.setRequestMethod("POST"); PrintWriter pw = new PrintWriter(cn.getOutputStream()); pw.append("SigStrength=" + Math.round(sum / 5)); pw.close(); // 送信 cn.getResponseCode(); // 切断 cn.disconnect(); } // 実行回数が5の倍数であれば強度の和をリセット if (i % 5 == 0) { sum = 0; } // 現在の強度を加算 sum += getStrength(); } catch (Exception e) { // TODO エラー処理 } } }, 0, 1000); // 上のrunを0ミリ秒後から1000ミリ秒間隔で実行する } } private void stop() { // タイマーの停止 if (timer != null) { timer.cancel(); timer = null; } } ```