gpt4 book ai didi

Android webview 在低于 5.0(lollipop) 时很慢,但在 5.0 中运行良好

转载 作者:太空宇宙 更新时间:2023-11-03 13:53:26 26 4
gpt4 key购买 nike

我面临有关在 5.0 以下的 android 中加载 url 的问题( Lollipop )加载数据太慢,但在 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>

最佳答案

在 Android 4.4(2013 年 10 月)中,Google 切换了其 WebView to use the Chromium rendering engine — 此举带来了显着的速度改进、大量新 API 以及使用 Chrome DevTools 进行远程调试的能力。

根据这个Google’s documentation他们在 Android 5.0 中更新了一些额外的功能,为 webview 带来了更高的性能。

The initial release for Android 5.0 includes a version of Chromium for WebView based on the Chromium M37 release, adding support for WebRTC, WebAudio, and WebGL.

Chromium M37 also includes native support for all of the Web Components specifications: Custom Elements, Shadow DOM, HTML Imports, and Templates. This means you can use Polymer and its material design elements in a WebView without needing polyfills.

Although WebView has been based on Chromium since Android 4.4, the Chromium layer is now updatable from Google Play.

因此,根据 webview 中的高端变化,与低版本相比,它可以更有效地加载数据。

对于你的问题,你可以在你的情况下加快 android webview 的性能,比如 Android webview slowAndroid 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);
}

希望这个回答对你有帮助。

关于Android webview 在低于 5.0(lollipop) 时很慢,但在 5.0 中运行良好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32457143/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com