自Lollipop以来,WebView的膨胀速度很慢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自Lollipop以来,WebView的膨胀速度很慢相关的知识,希望对你有一定的参考价值。

事实上,我很惊讶我在Stackoverflow中没有发现类似的问题,但我真的无法弄明白。

首先,请注意,这与WebView中浏览网页的性能无关。它只是在没有加载任何URL的情况下即使是空的WebView也会膨胀。

为了消除所有其他因素,我创建了一个全新的项目,其中包含重现问题所必需的内容。

在这个几乎空的项目中,我有一个只包含WebView的布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.testing.WebViewOnlyActivity">

    <WebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</FrameLayout>

我有一个MainActivity只包含一个Button开始这个WebViewOnlyActivity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, WebViewOnlyActivity.class);
                startActivity(intent);
            }
        });
    }
}

很简单吧?

现在,当我构建项目时,单击按钮,WebViewOnlyActivity需要超过1秒的时间来弹出。但是如果我按下后退按钮,然后再次按下按钮,WebViewOnlyActivity会立即出现。显然Android缓存了一些WebView。

这是我的测试设备: 1. Android 7.1.1:慢 2. Android 7.0.0:慢 3. Android 5.0.2慢 4. Android 4.4.1快速

所以在我看来,这只发生在Lollipop之后。

然而,这样的1.x秒延迟对我来说仍然是不可接受的。有谁知道如何解决它? (好吧,我认为这很难,因为我对这个WebView没有做任何事......可能我应该使用一些第三方WebView?)

附:我还使用了traceview来查看7.1.1设备和4.4.1设备之间的区别。很明显,WebView's init()方法占用了大量时间。

7.1.1:7.1.1 Trace View更深入:7.1.1 Deeper

4.4.1:4.4.1 Trace View更深入:4.4.1 Deeper

很大的区别!


虽然它确实是空的,但是Axel要求,我也会发布WebViewOnlyActivity的代码:

public class WebViewOnlyActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view_only);

    }
}

答案

编辑2017-12-21

我甚至创建了一个库来轻松解决这个问题。 你可以下载它here。 如果你发现它有用,给它一个明星:P


感谢@XavierRubioJansana的暗示,我尝试了ViewStub来推迟通货膨胀。

然而,即使我将通货膨胀延迟到onResume(),它仍然会减缓活动的产生。

但是,如果我使用HandlerpostDelay通货膨胀,活动立即产生!

    Handler webViewInflateHandler = new Handler();
    webViewInflateHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            if (!webViewInflated) {
                webView = (WebView) webViewStub.inflate();
                webViewInflated = true;
            }
        }
    }, 50);

然后,你需要延迟WebView的各种设置和加载,直到它膨胀。我建议在这里使用RxJava来观察BehaviorSubject<Boolean>

以上是关于自Lollipop以来,WebView的膨胀速度很慢的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android Lollipop 中保存 WebView 状态并恢复它?

Android Studio - 如何在 webview Lollipop 中上传文件 (Android 5.0)

自 Android 11 (SDK30) 以来,我无法将 HTML 文件从应用程序特定存储加载到 WebView

加载 webview 时膨胀类 android.webkit.WebView 时出错

膨胀 WebView XML 时出错

DVM 和 ART 有啥区别?为啥在 Lollipop 中 DVM 已正式被 ART 取代?