logを見ると25日の記録がない。24日の午後3時半以降の更新がない。 多分、24日にリブートがあり、その処理に問題があったのであろう。
59920,2023-05-23T07:18:34 60987,2023-05-23T13:01:58 62708,2023-05-23T14:07:35 63862,2023-05-23T18:00:35 63862,2023-05-24T05:38:14 65028,2023-05-24T08:40:48 67628,2023-05-24T09:04:48 68637,2023-05-24T12:03:58 70653,2023-05-24T12:33:03 71858,2023-05-24T12:48:44 73427,2023-05-24T13:15:37 74680,2023-05-24T13:32:18 76038,2023-05-24T14:33:16 77478,2023-05-24T15:30:33 77478,2023-05-25T08:14:23 77478,2023-05-26T06:14:04
手作業で 7370,2023-05-26T06:14:04 とする。
barrier=lift_gate に間違えているようだ。PC版では正常である。
アプリMapを強制終了して、再起動すると直った。再発するようならば原因を探る。
レンダリングはマルチスレッドで行っている。レンダリング完了時の map.invalidate() はこれまで排他制御していなかった。 ぶつかった場合、一方だけが無視されるならば問題ないが、全滅するのかも知れない。 それならば、時々、描画が漏れ、スクロールで描画されるのに納得がいく。
sychronized で囲んだ。これで解決かどうかは数日使ってみないと判断できない。
synchronized (map.objLock) { // 2023.5.20 map.invalidate(); }
数日前、SDカードをフォーマットせよという警告が出た。どうやら、microSDカードの異常があるようだ。 確か、現在のカードは以前、タブレットに使っていたものを流用したもののはずである。 スマホで1年半、OSMデータの更新も多いので、壊れても不思議はない。
さほど大容量はいらないので、64GBのmicroSDカードを購入した。5年ほど前は4、5千円したが、 今や千円以下となった。
64GBの場合、exFATのデフォルトのアロケーションユニットサイズは 128KB であるが、 平均的には小さいファイルを大量に書き込む関係から、今回はアロケーションユニットサイズは 32KBとした。
時々、ボタンやメニューが効かなくなったり、完全に、Mapアプリがフリーズする原因は SDカードの不調が関係していたかも知れない。しばらく様子を見たい。
これまで、負荷が高いほど、エラーが起きやすかったのは、I/O回数が多いためかも知れない。
SDカードを交換すると、ディレクトリ名が変わる。 現在は多くのプログラムで、このアドレスを設定しているため、修正箇所が多い。 いずれ、1か所にまとめるべきであろう。
現在は自宅で動きが少ないときは GPSによる位置情報取得は1時間ごとにした。
昨夜充電して、今日は雨なので、外出していないし、スマホは殆ど使っていない。 11時間たち、バッテリー使用量は5%、あと6日となっている。
この様子では、外出したり、適度に使った場合、平均的には、充電はこれまで通り、3日に1回くらいになるだろう。
外出時はGPSを1秒間隔としているが、いずれ、動きが少ない時は、10秒~数分間隔に広げたい。 散歩では2秒間隔でもいいかもしれない。
1日9時間たち、残り81%、あと5日となった。この間、GPSやStepCounterの負荷は低い。
その後、2時間弱散歩して、1日14時間たち、残り71%、あと4日となった。
GPSはバスや電車では1秒間隔でいいが、歩いているときは2~3秒間隔で十分であり、 自宅外でも静止状態のときは、1~5分間隔でもいいであろう。 移動中かどうかはGPS、歩数計だけでなく、いずれ加速度計も使う方がいいだろう。
取り敢えず、平均移動速度1m/s以上の時 1秒間隔、そうでなければ 3秒間隔とする。
1日21時間で、Map 24%、 画面 24%、モバイルネットワーク 13%、GooglePlay開発者サービス 12%、Chrome 7%、アイドル 7%、Google 4%、スギサポwalk 8%、Google Playストア 3%、…、合計 91%である。
5,6千歩散歩した。スギサポwalkの使用量が増えた。この間、デバッグしていないが、GooglePlay開発者サービスの使用量が多い。
GooglePlay開発者サービスの使用量はMapのデバッグデータに比例すると思っていたのは誤解であった。
1日10時間で、Map 15%、 画面 13%、モバイルネットワーク 9%、GooglePlay開発者サービス 5%、Chrome 6%、アイドル 5%、Google 3%、スギサポwalk 2%、Google Playストア 2%、…、合計 57%である。 Mapのバッテリー使用量をもう少し減らしたい。
GPSは外出時は1秒間隔、自宅では1時間間隔としている。30秒間隔で歩数監視をしているのが無駄であろう。 StepCounterの変化を検出したときに、30秒間に20歩以上かどうかを判断するように変更する。
[変更前]// StepCounterの値を監視する final Handler handler = new Handler(); final Runnable rn = new Runnable() { @Override public void run() { if (stepCount - lastStepCount >= 20 && atHome) { Utils.writeLog("移動あり、1秒間隔に変更する"); requestLocationUpdates(1000, true); } lastStepCount = stepCount; if (atHome && cntGPS >= 5) { Utils.writeLog("在宅により60分間隔に変更する"); requestLocationUpdates(60*60*1000, true); } cntGPS = 0; handler.postDelayed(this, 30*1000); } }; handler.post(rn);
lastStepCount(lastlog.csvに書き込んでいる数値)の初期値が問題ではなかろうか。
onCreateで lastStepCount = readInt("lastlog");
イベント受け取りで 1000歩ごとにログを取るようにしているが、履歴も取れていないし、 lastlog.csv への書き込みもない。
スマホの再起動が起きると、再起動前の lastStepCount に比べて、count はゼロから始まる。 つまり、再起動が起きたときは lastlog にゼロを書きこむ必要がある。
if (count - lastStepCount >= 1000) { // 1000 String log = count + "," + now; writeStepCounterLog(count, now); // append mode writeLine("lastlog", log, false); lastStepCount = count; }