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

Sir*_*Lam 5 java performance android webview

实际上,令我惊讶的是,我在Stackoverflow中没有找到类似的问题,但我真的不知道。

首先,请注意,这与在WebView中浏览网页的性能无关。它仅是要使一个空的WebView膨胀,而无需加载任何URL。

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

在这个几乎空的项目中,我的布局只包含一个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>
Run Code Online (Sandbox Code Playgroud)

而且我有一个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);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

很简单吧?

现在,当我构建项目时,单击按钮,弹出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快

因此在我看来,这仅发生于棒棒糖之后。

但是,这样的1.x秒延迟对我来说仍然是不可接受的。有人知道如何解决吗?(嗯,我认为这很困难,因为我没有对此WebView进行任何操作...可能是我应该使用一些第三方WebView吗?)

PS我也使用traceview来查看7.1.1设备和4.4.1设备之间的区别。显然,该WebView's init()方法占用大量时间。

7.1.1: 7.1.1跟踪视图 并进一步深入: 7.1.1更深

4.4.1: 4.4.1跟踪视图 并进一步深入: 4.4.1更深

巨大差距!


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

public class WebViewOnlyActivity extends AppCompatActivity {

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

    }
}
Run Code Online (Sandbox Code Playgroud)

Sir*_*Lam 6

编辑 2017-12-21

我什至创建了一个库来轻松解决这个问题。
你可以在这里下载。
觉得有用就给个星吧: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);
Run Code Online (Sandbox Code Playgroud)

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