【Android日誌】2016_01_18週:WebViewのキャッシュモード他
webViewのヒストリーバック時にERR_CACHE_MISS
ブラウザでも同じ挙動になるが、入力→確認→完了画面といった遷移でポストで情報を受け渡ししているとき、historyバックするとERR_CACHE_MISSというエラーになってonReceivedError
に入ってしまう。今回担当の要件は、onReceivedError
ではネットワークエラーに入るものとして使用していたので、ちょっとおかしなことになる(ネットワークはあるのに、通信エラーとしてダイアログが出る、など)
sdk19以降の挙動とかどこで見ればいいんだろう
http://developer.android.com/intl/ja/reference/android/webkit/WebSettings.htmldeveloper.android.com
webViewの設定setCacheMode
webViewのWebSettingにはキャッシュモードが選択できる。 キャッシュについては奥深そう・・・ http://dayafterneet.blogspot.jp/2011/08/androidwebview_23.htmldayafterneet.blogspot.jp
SDKバージョンとOSバージョン
リファレンスではSDKバージョンで説明してあることが多いのでここの対応関係は頭に入れておきたい。 結構OSバージョンで考えていることが多い。
WebView内のiframeについて
4.2以下の端末ではwebView内のiframeリンクタップ時にshouldOverrideUrlLoadingが呼ばれない。
何回もこの記事見てたけど、このことだったのか、と再実感。 ぶち当たる前に頭に入れておけたらいいのになぁ… qiita.com
Logを適切に使う
Fragmentの"java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState"
絶妙なタイミングでactivityが破棄されるとこの例外でアプリが落ちる可能性あり。
DialogFragmentのshowの中をどうカスタマイズするか http://kokufu.blogspot.jp/2014/08/onactivityresult-dialogfragmentshow.htmlkokufu.blogspot.jp
プロジェクトによってはtry,catchで囲んで握りつぶしているところもあったので、どういう対処が賢いのかちょっとわからない。
onReceivedErrorが複数回呼ばれる
弱電界から読み込み途中の際に圏外になった場合に発生(4.2以下でっぽい) そのうち、historyに何個も積まれるので、そのあとbackキー押しても同じページをloadするばかりで困る
アプリのcacheには何が入ってるのか
http://blog.livedoor.jp/an_square/archives/51803192.htmlblog.livedoor.jp
ブラウザのキャッシュもアプリのキャッシュに含まれるみたい。 他にはtempファイルも含まれるみたい。
http://computerexpert.web.fc2.com/android/recipe10-4.htmlcomputerexpert.web.fc2.com
API通信で一度読み込んだページはCacheしておいて、二度目の来訪にはキャッシュを使うなど、で自分でもCacheに保存できるみたい。 ブラウザは元々キャッシュ取ってるからwebViewでも知らぬ間にキャッシュを取っているんだろうな。
webViewのpostで遷移してきたページを戻す
LOAD_NO_CACHE
にwebVIewの設定をしたけど、スタックはしないが、結局アプリ内のキャッシュを見に行ってしまっていた キャッシュを消せばすべてインターネットから取得してくるようになって、最初から画面が読み込まれるようになった
ifの条件式の書き方
if文の条件式の書き方でレビューをもらった。
@DebugLog @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (mHogePresenter != null && mHogePresenter.shouldOverrideUrlLoading(url)) { return true; } else { return super.shouldOverrideUrlLoading(view, url); } }
考えかた
- 独自でハンドルする部分は、独自でハンドルする条件で条件を書く
- それ以外はsuperに任せる
@DebugLog @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (mDandoriWebViewPresenter == null) { return false; } return mDandoriWebViewPresenter.shouldOverrideUrlLoading(url) || super.shouldOverrideUrlLoading(view, url); }
イレギュラーなケースを先に持ってきて、後で正常な動きをする思想のときはこの書き方。 nullの時は例外としてfalseを返す、それ以外はまず独自でハンドルする、その方法じゃないと返ってきた時はsuperにお願いする。
@DebugLog @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (mDandoriWebViewPresenter == null) { return super.shouldOverrideUrlLoading(view, url); } else { return mDandoriWebViewPresenter.shouldOverrideUrlLoading(url); } }
これはあんまりよくない例で、nullチェックとsuperを呼ぶことに繋がりがない。
google +1の挙動
webViewのテストをしている時に+1の正しい挙動がわからなかったので、メモ。 webViewの中からgoogle+1を押下すると正しく動かない(6.0ですらブラウザに飛ばされて閉じられるだけで動かない) www.actzero.jp
4.2.2でWebViewのキャッシュクリアが効かない問題
// 4.4以降のヒストリーバック時のERR_CACHE_MISS・4.2以前のwebback後の遷移できない不具合をふせぐための設定 mHogeWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
でこのように設定していたが、4.2(.2)に関してはキャッシュが残ってしまうみたい。
@DebugLog @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { /* * OSVer:4.2.2のみ * setCacheMode(WebSettings.LOAD_NO_CACHE) * を設定しても、キャッシュを保存してしまうためページを読み込む前に明示的にキャッシュをクリアしています。 */ view.clearCache(false); if (mHogePresenter != null && mHogePresenter.shouldOverrideUrlLoading(url)) { return true; } else { return super.shouldOverrideUrlLoading(view, url); } }
onPageFinished()
やonPageStarted()
で呼ぶとキャッシュから読み込んでしまう間にキャッシュを切るので画像などが読み込めずに終わるため、ページを読み込む前のshouldOverrideUrlLoading()
に追加することにした。
Androidその他
Togglを使ってみる
時間管理の話で、Togglというサービスを見つけたので、現在使ってみている。 一旦は一日で実装の時間がどれくらいあって、それ以外の時間がどれくらいあるのか?を可視化してみるため。
英語読むの辛い時の情報収集
Forkwell Press – 「煽って盛り上げるのは“自分がその技術を使いたいから”なんです」-Increments...
ですので、先ほど挙げた「Hacker News」や、JS版のHacker Newsのような「Echo JS」といったサイトで、まずは見出しを中心に目を通すようにしています。「最近、この単語が見出しによく出ているのに、自分は手を付けていないな」と感じた時に、きちんと調べ出すといった感じですね。
英語読めないし読んでも頭に入らないのに読んだほうがいいって言われても・・・と思っていたので、こういうのは勇気づけられる。