web-dev-qa-db-ja.com

Android webviewが遅い

Android webviewsが遅い。これは、携帯電話から3.0+タブレットまで、あらゆるものに十分な仕様があります

ウェブビューは「制限」されるはずですが、あらゆる種類のCSS3JQueryのソーサリーを使用しなければならない電話のギャップでウェブアプリが行われているのがわかります。

だから私は何かが欠けています、物事をスピードアップするために使用できるmyWebview.SPEEDHACK(1)のようなものがありますか?

また、Webビューのコンテンツがロードされない場合があります。ゆっくりロードするのではなく、ロードされません。テスト対象のアセットはローカルに保存され、エラーはありません。

162
CQM

ロードされるWebアプリケーションに依存します。以下のアプローチをいくつか試してください。

より高いレンダリング優先度を設定(API 18+から非推奨):

webview.getSettings().setRenderPriority(RenderPriority.HIGH);

ハードウェアアクセラレーションの有効化/無効化:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
    // chromium, enable hardware acceleration
    webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else {
    // older Android version, disable hardware acceleration
    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

キャッシュを無効にします(コンテンツに問題がある場合):

webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
125
peceps

このAndroid:hardwareAccelerated="true"をマニフェストに追加することが、パフォーマンスを大幅に向上させた唯一のものでした

詳細はこちら: http://developer.Android.com/guide/topics/manifest/application-element.html#hwaccel

48
Sender

私たちの解決策は反対でした。このコードを使用して、(マニフェスト内のアプリ全体ではなく)WebViewのみでハードウェアアクセラレーションを無効にしました。

if (Build.VERSION.SDK_INT >= 11){
    webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

CSS3アニメーションがよりスムーズになりました。 Android 4.0を使用しています。

詳細はこちら: https://code.google.com/p/Android/issues/detail?id=17352

35
Ena

私は次が最もうまくいくと思います:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
    webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else {
    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

Android 19には、WebView用のChromiumエンジンがあります。ハードウェアアクセラレーションの方がうまく機能すると思います。

12
Tedi

私はこれと同じ問題を抱えていたので、解決しなければなりませんでした。私はこれらの解決策を試しましたが、最終的には、少なくともスクロールのパフォーマンスはまったく改善しませんでした。それで、ここで私が実行したワーカロードと、なぜそれが私のために働いたのかの説明。

「MiWebView」クラスを作成し、「onTouchEvent」メソッドを上書きし、少なくともすべてのドラッグイベントが発生する時間を印刷することにより、ドラッグイベントを少しだけ調べる機会があった場合、それらが分離されていることがわかります。 (最低)9msの時間内に。それは、イベント間の非常に短い時間です。

WebView Source Code を見て、onTouchEvent関数を見てください。プロセッサが9ミリ秒未満で処理することは不可能です(夢を見てください!!!)。だからこそ、「タッチダウンのためのWebCoreの応答を待っているので、ドラッグを忘れる」と常に見ます。メッセージ。コードは時間通りに処理できません。

修正方法まず、onTouchEventコードを書き換えて改善することはできません。それは多すぎます。ただし、ドラッグ動作のイベントレートを40ミリ秒または50ミリ秒に制限するために、「モックする」ことができます。 (これはプロセッサに依存します)。

すべてのタッチイベントは、ACTION_DOWN-> ACTION_MOVE ...... ACTION_MOVE-> ACTION_UPのようになります。したがって、DOWNとUPの動きを維持し、MOVEレートをフィルタリングする必要があります(これらは悪者です)。

そして、ここにそれを行う方法があります(2本指タッチなどのイベントタイプを追加できます。ここで興味があるのは、1本の指のスクロールだけです)。

import Android.content.Context;
import Android.view.MotionEvent;
import Android.webkit.WebView;


public class MyWebView extends WebView{

    public MyWebView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    private long lastMoveEventTime = -1;
    private int eventTimeInterval = 40;

    @Override
    public boolean onTouchEvent(MotionEvent ev) {

        long eventTime = ev.getEventTime();
        int action = ev.getAction();

        switch (action){
            case MotionEvent.ACTION_MOVE: {
                if ((eventTime - lastMoveEventTime) > eventTimeInterval){
                    lastMoveEventTime = eventTime;
                    return super.onTouchEvent(ev);
                }
                break;
            }
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_UP: {
                return super.onTouchEvent(ev);
            }
        }
        return true;
    }
}

もちろん、WebViewの代わりにこのクラスを使用すると、スクロールするときに違いがわかります。

これはソリューションへのアプローチにすぎませんが、WebViewを使用しているときに画面に触れるため、すべてのラグの場合にまだ完全には実装されていません。しかし、少なくとも私の特定のニーズには、私が見つけた最良のソリューションです。

9
Nate Castro

Phonegapアプリのレンダリングパフォーマンスの問題を修正するために、すべての提案を試みました。しかし、実際に機能するものは何もありませんでした。

最後に、丸一日検索した後、私はそれを作りました。 AndroidManifestのタグ(タグではなく)内に設定します

<application Android:hardwareAccelerated="false" ...

これで、アプリは私のウェブブラウザと同じように高速に動作します。ハードウェアアクセラレーションが常に最良の機能ではない場合、...

私が持っていた詳細な問題: https://stackoverflow.com/a/24467920/3595386

8
user3595386

これらの答えはどれも私にとって役に立たなかった。

最後に、理由と解決策を見つけました。その理由は、多くのCSS3フィルター(フィルター、-webkit-filter)でした。

ソリューション

クラス「低品質」をHTML本文に追加するために、WebページスクリプトでWebViewの検出を追加しました。ところで。 WebView設定でuser-agentを設定することにより、WebViewを簡単に追跡できます。次に、新しいCSSルールを作成しました

body.lowquality * { filter: none !important; }
4
l00k

WebViewのコンポーネントの一部が低速または遅延している場合は、これを要素cssに追加してみてください。

transform: translate3d(0,0,0);
-webkit-transform: translate3d(0,0,0);

これは、私のWebビューに実際に影響を与えた唯一のスピードハックです。ただし、使いすぎないように注意してください! (ハックの詳細については この記事 をご覧ください。)

4
Erex

これを試して:

mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
3

onclickイベントにバインドしている場合、タッチスクリーンでは遅くなる可能性があります。

より速くするために、 fastclick を使用します。これは、はるかに速いタッチイベントを使用してクリックイベントを模倣します。

2
Tzach