事实上,我很惊讶我在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?)
P.S。我还使用了traceview来查看7.1.1设备和4.4.1设备之间的区别。很明显,WebView's
init()
方法占用了大量时间。
大不同!
虽然它确实是空的,但是Axel要求,我也会发布WebViewOnlyActivity的代码:
public class WebViewOnlyActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view_only);
}
}
答案 0 :(得分:3)
编辑2017-12-21
我甚至创建了一个库来轻松解决这个问题 您可以下载它here 如果你发现它有用,给它一个明星:P
感谢@XavierRubioJansana的提示,我尝试ViewStub来推迟通货膨胀。
但是,即使我将通货膨胀延迟到onResume()
,它仍然会减缓活动的产生。
但是如果我使用Handler
到postDelay
通货膨胀,活动会立即产生!
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>
。