我在5.0以下的android(棒棒糖)加载url时遇到问题 加载数据太慢,但在Android 5.0或更高版本中工作正常。如何解决这个问题? I have follow this link。 &安培; How to improve webview load time
我的代码是
@SuppressLint({ "SetJavaScriptEnabled", "DefaultLocale" })
public class YS_WebViewActivity extends Activity
{
private Button btnDone;
private WebView webViewLoadUrl;
private YS_GeneralUtility generalUtility;
private Dialog alertDialogBox;
private String url = "";
private TextView tvLoading;
private Button btnCancel;
private Button btnRetry;
@SuppressLint("InlinedApi")
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_webview);
btnDone = (Button) findViewById(R.id.btnDone);
webViewLoadUrl = (WebView) findViewById(R.id.webViewLoadUrl);
//webViewLoadUrl.setBackgroundColor(Color.parseColor("#123456"));
tvLoading = (TextView) findViewById(R.id.tvLoading);
url = getIntent().getExtras().getString("url");
webViewLoadUrl.setVisibility(View.INVISIBLE);
generalUtility = new YS_GeneralUtility(this);
webViewLoadUrl.getSettings().setJavaScriptEnabled(true); // enable javascript
try {
webViewLoadUrl.getSettings().setRenderPriority(RenderPriority.HIGH);
webViewLoadUrl.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
webViewLoadUrl.getSettings().setDomStorageEnabled(true);
webViewLoadUrl.getSettings().setAllowFileAccess(true);
webViewLoadUrl.getSettings().setAllowContentAccess(true);
webViewLoadUrl.getSettings().setAllowFileAccessFromFileURLs(true);
//webViewLoadUrl.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_NEVER_ALLOW);
} catch (Exception e) {
e.printStackTrace();
}
tvLoading.setTypeface(generalUtility.faceAvenirLight);
btnDone.setTypeface(generalUtility.faceAvenirMedium);
btnDone.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
myErrorFinish();
}
});
webViewLoadUrl.setWebViewClient(new WebViewClient()
{
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
//Log.i(TAG, "Processing webview url click...");
view.loadUrl(url);
return true;
}
public void onPageFinished(WebView view, String url)
{
//Log.i(TAG, "Finished loading URL: " + url);
webViewLoadUrl.setVisibility(View.VISIBLE);
tvLoading.setVisibility(View.INVISIBLE);
}
String errorData = "<html><head></head>"
+ "<body style=' font-family:Avenir !important;font-weight:lighter !important; color:#ffffff; margin : 0px auto;'>"
+ "<div style = 'width : 100% ; height : 100% ; background:#123456;'> </div>"
+ "</body></html>";
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
{
// Log.e(TAG, failingUrl + "Error: " + description);
view.loadData(errorData, "text/html", "UTF-8");
alertDialogOnInternetOff(getString(R.string.errorMsgInternet));
// finish();
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
super.onReceivedSslError(view, handler, error);
handler.proceed();
}
});
webViewLoadUrl.loadUrl(url);
// setContentView(webview);
}
private void alertDialogOnInternetOff(String message)
{
alertDialogBox = new Dialog(YS_WebViewActivity.this, R.style.InternetErrorPopup);
alertDialogBox.requestWindowFeature(Window.FEATURE_NO_TITLE);
alertDialogBox.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
alertDialogBox.setContentView(R.layout.internetpopup_dialog);
alertDialogBox.setCancelable(false);
alertDialogBox.show();
btnCancel = (Button) alertDialogBox.findViewById(R.id.btnCancel);
btnRetry = (Button) alertDialogBox.findViewById(R.id.btnRetry);
TextView txtExitMessage = (TextView) alertDialogBox.findViewById(R.id.textViewMessage);
TextView horizontalLinePopup = (TextView) alertDialogBox.findViewById(R.id.horizontalLinePopup);
TextView verticalLinePopup = (TextView) alertDialogBox.findViewById(R.id.verticalLinePopup);
horizontalLinePopup.setBackgroundColor(getResources().getColor(R.color.internetpopupBorderinnerpageColor));
verticalLinePopup.setBackgroundColor(getResources().getColor(R.color.internetpopupBorderinnerpageColor));
txtExitMessage.setTypeface(generalUtility.faceAvenirLight);
btnCancel.setTypeface(generalUtility.faceAvenirLight);
btnRetry.setTypeface(generalUtility.faceAvenirLight);
txtExitMessage.setText(R.string.errorMsgInternet);
btnCancel.setText(R.string.cancel);
btnRetry.setText(R.string.retry);
alertDialogBox.setCancelable(false);
btnCancel.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
alertDialogBox.dismiss();
Log.d("AlertDialog", "Negative");
YS_WebViewActivity.this.finish();
}
});
btnRetry.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
alertDialogBox.dismiss();
Log.d("AlertDialog", "Positive");
tvLoading.setVisibility(View.VISIBLE);
webViewLoadUrl.loadUrl(url);
}
});
}
private void myErrorFinish()
{
/*
* Jump to the Setting Screen on pressing back button of device
*/
YS_WebViewActivity.this.finish();
//overridePendingTransition(R.anim.abc_slide_in_bottom, R.anim.abc_slide_out_bottom);
}
@Override
public void onBackPressed()
{
myErrorFinish();
super.onBackPressed();
}
}
这是XML ......
<RelativeLayout
android:id="@+id/RelativeLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/listback"
android:orientation="vertical" >
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="42dip"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:background="@drawable/navigationbackground" />
<Button
android:id="@+id/btnDone"
android:layout_width="wrap_content"
android:layout_height="42dip"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="@android:color/transparent"
android:text="@string/done"
android:textColor="@android:color/white"
android:textSize="17sp" />
<WebView
android:id="@+id/webViewLoadUrl"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/btnDone"
android:layout_centerVertical="true" />
<TextView
android:id="@+id/tvLoading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:gravity="center"
android:text="@string/loading"
android:textColor="@android:color/white"
android:textSize="18sp" />
</RelativeLayout>
答案 0 :(得分:2)
借助Android 4.4(2013年10月),Google切换了WebView to use the Chromium rendering engine - 此举带来了显着的速度提升,众多新API以及使用Chrome DevTools进行远程调试的能力。
根据此Google’s documentation,他们更新了Android 5.0中的更多其他功能,为网络视图带来了更高的性能。
Android 5.0的初始版本包含一个版本的Chromium for WebView基于Chromium M37版本,增加了对WebRTC的支持, WebAudio和WebGL。
Chromium M37还包括对所有Web的本机支持 组件规格:自定义元素,Shadow DOM,HTML Imports, 和模板。这意味着您可以使用Polymer及其材料设计 WebView中的元素,无需填充。
虽然自Android 4.4以来WebView一直基于Chromium,但是 Chromium图层现在可以从Google Play更新。
因此,根据webview中的高端更改,它可以有效地加载数据,与较低版本进行比较。
对于您的问题,您可以加快您的案例中的Android webview性能,例如Android webview slow和Android WebView performance或类似Android webview loading data performance very slow
Hardware Acceleration vll诀窍。你可以在你的应用程序的不同级别使用它answer我也提到了其他类型。
我认为以下效果最佳:
if (Build.VERSION.SDK_INT >= 19) {
webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
}
else {
webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
希望这个答案能帮助你。
答案 1 :(得分:0)
尝试
webview.getSettings().setRenderPriority(RenderPriority.HIGH);
webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);