2013-02-28 13 views
22

Lightning Browserと呼ばれるオープンソースのブラウザを開発していますが、Android(4.2.2)の最新のアップデートで問題が発生しました。WebViewが触れられるまでレンダリングに失敗する4.2.2

WebViewsは、ビューに触れるまで完全にレンダリングできません。最新のAndroidバージョンでのみ発生します。 4.2.1では、WebViewが完全に正常にレンダリングされました。開発用にNexus 7を使用し、4.2.2アップデートを受け取った直後にブラウザがレンダリングを停止しました。他のユーザーもこれを経験し、4.2.2でのみ発生することが複数回確認されました。 APIレベル16と17をターゲットにしていますが、この問題がなくてもAPIレベル9をターゲットとするWebKitブラウザがあります。

私はここでスタックオーバーフロー(Android WebView renders blank/white, view doesn't update on css changes or HTML changes, animations are choppy)で見つかった問題の解決方法を使用してこれを解決しようとしました。ただし、WebViewのRenderPriorityを高く設定するだけでは解決できません... WebViewのOnDraw()メソッド内にinvalidate()コマンドを配置するだけです。これにより、WebViewが継続的に再描画されます。これは動作します(並べ替え)、アニメーションはスムーズで、ページは非常に高速に読み込まれますが、WebViewのパフォーマンスは低下します。

私はこの質問も見たことがありますが(私のものに非常に似ています)、それには良い答えはありません。 Android WebView Fails to Completely Render Content Until User Interaction

パフォーマンス低下とは、入力を意味します。テキストの入力が遅れ、WebView自体は以前と同じように何が起こっているのかを処理できません。 invalidate()メソッド呼び出しでブラウザをベンチマークすると、ベンチマークのパフォーマンスが約8%低下します。私はベンチマークがすべてではないことを知っていますが、連続的な描画がシステムに負担をかけ、システムに他のタスクを無視させていることがわかります。

結論... Android 4.2.2のWebViewは、タッチされるまでレンダリングされません。私がこれを修正するために知っている唯一の方法は、WebViewのonDraw()メソッドでinvalidate()を呼び出すことです。これはパフォーマンスが悪いので、これを修正する別の方法を探しています。

マジックコード(私は現在使用している)...

class MyWebView extends WebView 
{ 
    @Override 
    onDraw(Canvas canvas) 
    { 
     invalidate(); 
     super.OnDraw(canvas); 
    } 
} 

invalidate(); 

を削除し、触れるまではレンダリングされません。

WebViewのレンダリングの仕方に関する提案は誰にもありますか?ちなみに、これはStackについて私がここで尋ねた最初の質問です。私が明確でないか、私が間違ったことをした場合、私を許してください。

EDIT: 私はこの質問を見つけました。この問題はほぼ同じような問題であり、解決されました。問題は、答えが何を意味するのか分かりません。誰かが私を啓発できるなら、それは助けになるかもしれません。

私は、だから私は最終的に問題はないレンダリングするのWebViewを引き起こしたlogcat

E/chromium(1243): external/chromium/net/disk_cache/backend_impl.cc:2022: [0705/172030:ERROR:backend_impl.cc(2022)] Corrupt Index file 
+0

この問題は私たちの問題に関連していません。ページは空白ですが、読み込みにエキゾチックな問題があるため、レンダリングパイプラインとは関係ありません。 – rupps

+0

BTW ...私の場合も、実行時にJQueryを使用して選択した場合、キーボード入力のパフォーマンスが非常に悪くなり(ページの複雑さが増すにつれて低下します)、HTML入力の選択時にネイティブ入力オーバーレイがトリガーされます。あまりエレガントではありませんが、ネイティブ入力は完璧に機能し、テキストの選択/切り取り/貼り付けは面倒ではありません... – rupps

+0

パフォーマンスを低下させない代替方法http://stackoverflow.com/a/19253633/236743 :) – Dori

答えて

9

にこのエラーが発生します。私は、WebViewのWebViewClient内でドロアブルのアニメーションを開始および停止しています。このドロウアブルは、単にページがロードされているときに回転するリフレッシュボタンです...単純ですね?

ブラウザの非フルスクリーンモードでは、回転可能なdrawableとWebViewは両方とも同じ親の子ですが、フルスクリーンモードではDrawableはWebViewの子になります。どういうわけか、ページがロードされているときにアニメーションを開始し、終了時に(フルスクリーンで)停止すると、アプリケーションは回転可能なドロワブルがすべての描画能力を必要としていると判断し、WebViewは描画しません。フルスクリーンモードで描画可能ファイルがWebViewの子になると、WebViewは描画可能ファイルよりも描画優先順位が高くなり、細かい描画が行われます。

ストーリーのモラルは... WebViewは、描画される最優先のビューのようです。より優先度の高い他のビューがある場合、それらは正しく描画されません。

私はアニメーションの熟練者ではないので、WebViewを中断しないように、現在どのように描画可能なアニメーションを作成しているのか再考する必要があります。

うまくいけばうまくいきました。読んでくれてありがとう。

+1

スピーチアニメーションについては、ダミーのHTMLアニメーションをページのどこかに適用すると、Webviewの再描画がトリガーされることがわかりましたが、非常に汚いハックです。 – rupps

+0

OMG。それはまさに私がやっていたことです!そして私は、引出しがロードされない理由を何日も断っていました。どうもありがとう。答えは回転アニメーションを使用していないのですか? –

+0

これはAndroid Kitkatを実行している端末では発生しません。彼らは何かを修正しましたか? –

2

Android WebView renders blank/white, view doesn't update on css changes or HTML changes, animations are choppyの@Olivierによる最後の回答を参照してください、彼はonDrawで連続してではなく、WebViewのOnTouchEventで遅延無効化をいくつかトリガーします...私の場合は、(ほとんど)私の問題は、私はいくつかのCSSを変更しました。もちろん、自動/タイムアウトされたCSSのケースでは全く適用されません

私の場合は、JavaからJavaScript関数をエクスポートして手動で無効化をトリガーするのに役立ちました。以下の災害が起こるかもしれないどこにそれを手動でトリガすることができます知っている、あなたのWebView内でこの内部クラスのようなもの:

Invalidater.trigger(100); 

をミリ秒で遊ぶ:

public class MyWebView extends WebView { 

    private class InvalidateExtension { 

     private Handler handler=new Handler(); // you might already have a handler 
     private Runnable mInvalidater=new Runnable() { 

      @Override 
      public void run() { 
       MyWebView.this.invalidate(); 
      } 

     } 

     public void trigger(int delay) { 
       handler.postDelayed(mInvalidater, delay); 
       handler.postDelayed(mInvalidater, 2*delay); // just in case 
       handler.postDelayed(mInvalidater, 4*delay); // just in case just in case :) 
     } 
    } 


    /** Call this function on this view's init, BEFORE loading a page so it is available to JS */ 
    private void call_me_on_init_to_enable_hack() { 
     addJavascriptInterface(new InvalidateExtension(), "Invalidater"); 
    } 
} 

ので、JavaScriptのからあなたが行うことができます値....

これは誰かを助けることを願っています!

3

マニフェストに無効にハードウェアアクセラレーション:

アンドロイド:hardwareAccelerated =「false」を

+2

おそらく最高の解決策ではありませんが、私の場合は唯一のことでした。 – SSemashko

+0

これは動作しますが、@ Scarmysunは好ましくないと言います – vanthome

2

あり、電話を回転させたときにズーム倍率に問題があり、それがこの問題、部品やページ全体が発生します描かれません。これを解決するには、WebViewClientの実装でonScaleChangedをオーバーライドし、ビューを無効にします。それは必要なときに強制的に再描画する必要があります。

+1

チップをありがとう! – anthonycr

関連する問題