首先,请注意这与在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>
我有一个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?)
P.S. 我还使用traceview查看了7.1.1设备和4.4.1设备之间的区别。很明显,WebView的init()
方法占用了很多时间。
差别很大!
虽然它确实很空,但由于Axel的要求,我也会发布WebViewOnlyActivity的代码:
public class WebViewOnlyActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view_only);
}
}
Activity
中创建一个隐藏的WebView
,在适当的时刻(例如,在onStart
之后)将其销毁。这样可以“激活”操作系统缓存。另一种选择是用ViewStub
替换WebView
,以便在onStart
之后延迟加载WebView
。用户会很快看到Activity
,然后WebView
就会加载。 - Xavier Rubio JansanaonResume
中,它仍然占用了活动创建时间。但是,如果我使用Handler
加上postDelayed
,活动会立即出现。非常感谢! - Sira Lam