为什么我的 Android Webview 这么慢
Why My Android Webview Is So Slow
我尝试了一些方法来解决速度问题,但网站在 webview 上加载非常非常慢,即使它在 Chrome 中打开需要 3 秒。我尝试的是,在我的代码中添加这两行;
mWebview.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
mWebview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
并添加
android:hardwareAccelerated="true"
到我的清单文件,因为我在那里找到了这些解决方案。但它不起作用。那有什么问题呢?谢谢指教。
onCreateView 我的部分代码:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_home, container, false);
mPbar = (ProgressBar) rootView.findViewById(R.id.web_view_progress);
mView = (FrameLayout) rootView.findViewById(R.id.web_view);
mView.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
mImageView = new ImageView(getActivity());
mImageView.setBackgroundColor(getResources().getColor(android.R.color.white));
mImageView.setImageResource(R.drawable.big_image_loading);
mImageView.setScaleType(ScaleType.CENTER_INSIDE);
mImageView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
mImageView.post(new Runnable() {
@Override
public void run() {
((AnimationDrawable) mImageView.getDrawable()).start();
}
});
mView.addView(mImageView);
mWebview = new WebView(getActivity());
mWebview.setVisibility(View.GONE);
mWebview.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
if(internetAccess()){
if (mUrl != null) {
mWebview.setWebChromeClient(new MyWebChromeClient());
mWebview.getSettings().setPluginState(PluginState.ON);
mWebview.getSettings().setUseWideViewPort(true);
mWebview.getSettings().setDefaultZoom(ZoomDensity.FAR);
mWebview.getSettings().setBuiltInZoomControls(true);
mWebview.getSettings().setSupportZoom(true);
mWebview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
mWebview.getSettings().setAllowFileAccess(true);
mWebview.getSettings().setDomStorageEnabled(true);
mWebview.getSettings().setJavaScriptEnabled(true);
mWebview.getSettings().setAppCacheEnabled(true);
mWebview.setWebViewClient(new MyWebViewClient());
if (Build.VERSION.SDK_INT >= 17)
mWebview.getSettings().setMediaPlaybackRequiresUserGesture(false);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
mWebview.getSettings().setDisplayZoomControls(false);
mWebview.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
mWebview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
mWebview.loadUrl(mUrl);
}
mView.addView(mWebview);
mBackBtn = (ImageButton) rootView.findViewById(R.id.web_view_btn_back);
mFowardBtn = (ImageButton) rootView.findViewById(R.id.web_view_btn_forward);
mRefreshBtn = (ImageButton) rootView.findViewById(R.id.web_view_btn_refresh);
mRefreshPbar = (ProgressBar) rootView.findViewById(R.id.loading);
// mShareBtn = (ImageButton) rootView.findViewById(R.id.web_view_btn_share);
mBackBtn.setOnClickListener(this);
mFowardBtn.setOnClickListener(this);
mRefreshBtn.setOnClickListener(this);
updateActionView();
return rootView;
}
}
好的,我解决了问题。问题不在于 WebSettings。 view.setVisibility(View.VISIBLE);部分在我的 onPageFinished 函数上,这就是网站加载如此缓慢的原因。我将其移至 onPageStarted 函数并且运行速度非常快。
我尝试了一些方法来解决速度问题,但网站在 webview 上加载非常非常慢,即使它在 Chrome 中打开需要 3 秒。我尝试的是,在我的代码中添加这两行;
mWebview.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
mWebview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
并添加 android:hardwareAccelerated="true" 到我的清单文件,因为我在那里找到了这些解决方案。但它不起作用。那有什么问题呢?谢谢指教。
onCreateView 我的部分代码:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_home, container, false);
mPbar = (ProgressBar) rootView.findViewById(R.id.web_view_progress);
mView = (FrameLayout) rootView.findViewById(R.id.web_view);
mView.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
mImageView = new ImageView(getActivity());
mImageView.setBackgroundColor(getResources().getColor(android.R.color.white));
mImageView.setImageResource(R.drawable.big_image_loading);
mImageView.setScaleType(ScaleType.CENTER_INSIDE);
mImageView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
mImageView.post(new Runnable() {
@Override
public void run() {
((AnimationDrawable) mImageView.getDrawable()).start();
}
});
mView.addView(mImageView);
mWebview = new WebView(getActivity());
mWebview.setVisibility(View.GONE);
mWebview.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
if(internetAccess()){
if (mUrl != null) {
mWebview.setWebChromeClient(new MyWebChromeClient());
mWebview.getSettings().setPluginState(PluginState.ON);
mWebview.getSettings().setUseWideViewPort(true);
mWebview.getSettings().setDefaultZoom(ZoomDensity.FAR);
mWebview.getSettings().setBuiltInZoomControls(true);
mWebview.getSettings().setSupportZoom(true);
mWebview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
mWebview.getSettings().setAllowFileAccess(true);
mWebview.getSettings().setDomStorageEnabled(true);
mWebview.getSettings().setJavaScriptEnabled(true);
mWebview.getSettings().setAppCacheEnabled(true);
mWebview.setWebViewClient(new MyWebViewClient());
if (Build.VERSION.SDK_INT >= 17)
mWebview.getSettings().setMediaPlaybackRequiresUserGesture(false);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
mWebview.getSettings().setDisplayZoomControls(false);
mWebview.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
mWebview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
mWebview.loadUrl(mUrl);
}
mView.addView(mWebview);
mBackBtn = (ImageButton) rootView.findViewById(R.id.web_view_btn_back);
mFowardBtn = (ImageButton) rootView.findViewById(R.id.web_view_btn_forward);
mRefreshBtn = (ImageButton) rootView.findViewById(R.id.web_view_btn_refresh);
mRefreshPbar = (ProgressBar) rootView.findViewById(R.id.loading);
// mShareBtn = (ImageButton) rootView.findViewById(R.id.web_view_btn_share);
mBackBtn.setOnClickListener(this);
mFowardBtn.setOnClickListener(this);
mRefreshBtn.setOnClickListener(this);
updateActionView();
return rootView;
}
}
好的,我解决了问题。问题不在于 WebSettings。 view.setVisibility(View.VISIBLE);部分在我的 onPageFinished 函数上,这就是网站加载如此缓慢的原因。我将其移至 onPageStarted 函数并且运行速度非常快。