【Android日誌】2016_01_18週:WebViewのキャッシュモード他

webViewのヒストリーバック時にERR_CACHE_MISS

ブラウザでも同じ挙動になるが、入力→確認→完了画面といった遷移でポストで情報を受け渡ししているとき、historyバックするとERR_CACHE_MISSというエラーになってonReceivedErrorに入ってしまう。今回担当の要件は、onReceivedErrorではネットワークエラーに入るものとして使用していたので、ちょっとおかしなことになる(ネットワークはあるのに、通信エラーとしてダイアログが出る、など)

stackoverflow.com

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バージョンで考えていることが多い。

AndroidのバージョンとAPIレベルの対応関係

WebView内のiframeについて

4.2以下の端末ではwebView内のiframeリンクタップ時にshouldOverrideUrlLoadingが呼ばれない。

sakura-bird1.hatenablog.com

何回もこの記事見てたけど、このことだったのか、と再実感。 ぶち当たる前に頭に入れておけたらいいのになぁ… qiita.com

Logを適切に使う

www.javadrive.jp

Fragmentの"java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState"

絶妙なタイミングでactivityが破棄されるとこの例外でアプリが落ちる可能性あり。

qiita.com

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を呼ぶことに繋がりがない。

dev.classmethod.jp

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)に関してはキャッシュが残ってしまうみたい。

stackoverflow.com

stackoverflow.com

        @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というサービスを見つけたので、現在使ってみている。 一旦は一日で実装の時間がどれくらいあって、それ以外の時間がどれくらいあるのか?を可視化してみるため。

shoma2da.hatenablog.com

英語読むの辛い時の情報収集

Forkwell Press – 「煽って盛り上げるのは“自分がその技術を使いたいから”なんです」-Increments...

ですので、先ほど挙げた「Hacker News」や、JS版のHacker Newsのような「Echo JS」といったサイトで、まずは見出しを中心に目を通すようにしています。「最近、この単語が見出しによく出ているのに、自分は手を付けていないな」と感じた時に、きちんと調べ出すといった感じですね。

英語読めないし読んでも頭に入らないのに読んだほうがいいって言われても・・・と思っていたので、こういうのは勇気づけられる。