LoginSignup
2
0

More than 5 years have passed since last update.

WebViewで文字数が多い(?)データをロードするとエラーになる件(さらに追記あり)

Last updated at Posted at 2017-04-21

追記

頂いたコメントをもとに追記しました。(2017/4/26 さらに追記)
追記部分は 斜体 で記載しています。

起こったこと

対象は WebView#loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl) です。

第2引数にHTML文字列を渡しますが、ここに桁数の大きいデータを渡したときに画面が真っ白に表示されてしまいました。

調査したこと

WebViewは昔からバグが多かったので、そのあたりは意識して調査しました。

最初はデータの構文が悪いのだと思い、データを分解しつつ表示確認したところ、どのデータも正常に表示されてしまいました。

データ自体には不備がないみたいなので、分解したデータを少しづつ結合してロードすると9,000桁くらいまでは表示されるのですが、10,000桁を超えたあたりで画面が真っ白に。

ただ、単純な文字列を読ませると20,000桁でも表示できてしまうので、レンダリング後のデータ量や、特定の構文の場合に起こるのかもしれません。

謎は深まるばかり…

頂いたコメントをもとにlayoutHeightに着目しました。
これはいい線いっているみたいで、Nexus5 で 2009px まで表示されて、 2010px では表示されない結果になりました。

高さが理由なら単純な文字列をたくさんロードさせてもエラーにならない理由にもなります。

ただ、Nexus6P で試すと 2010px 以上でも表示されてしまったので、固定値の上限ではなさそうです...

もう少し調査が必要かな。

同じ現象に直面している人

ググったけどほとんどヒットしなくて、やっと見つけたのは次のものくらいでした。

この方も桁数に着目しています。

layerType にWebView.LAYER_TYPE_HARDWARE をセットすることで解決するような記述があり試してみましたが、渡したHTMLデータによってはエラー(IllegalStateException: Unable to create layer for WebView)になってしまいました。

手詰まりです…

解決策

正直突破する方法は見つけれていなくて、わかる方がいれば助けてほしいのですが、とりあえずローカルにファイル吐いて読み直すなどして回避するしかない感じです…
高さが原因だとファイル吐いても意味ないかもしれません...

WebView#getUrl() でも同様の現象が発生しました。
ただこのケースで発生するともっと事例が挙がっているはずなので、WebView を ScrollView で囲っているのが原因かもしれないです。
これについては色々と検証して別記事にまとめようと思います。(2017/4/26)

WebViewはよくバグがあったのは知っていましたが、正直もう使いたくないなー

2
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0