Android webview加载数据性能很慢 [英] Android webview loading data performance very slow

查看:72
本文介绍了Android webview加载数据性能很慢的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,我正在开发一个应用程序,因为我使用的是 Android WebView.每当我启动 webview 活动时,都会从 test.txt 文件中加载字符串 html 格式的数据.test.txt 文件包含将近 2.5 MB 的数据,加载 test.txt 文件后,如果滑动屏幕结束读取所有数据并按返回.然后随后启动 webview 活动需要更多时间来呈现数据.在首次启动 webview 时,它花费的时间最少.在启动此活动之间,我没有收到任何错误/异常/崩溃.

Hi I am working on one application, In that I am using Android WebView. Whenever I launch webview activity, loading data in string html format from test.txt file. test.txt file contains nearly 2.5 MB data, after loading test.txt file, if slide screen to end to read all data and press back. Then subsequent launch of webview activity taking more time to render data. In first launch of webview its taking minimal time. I am not getting any error/exception/crash in between launching this activity.

我使用的是 Android API 级别 18 及以上

I am using Android API level 18 and above

注意:我对这个问题进行了大量研究.我尝试了 Android webview slowAndroid WebView 性能没用.

Note: I did lot of research on this issue. I tried Solution from Android webview slow and Android WebView performance no use.

我无法制作 android:hardwareAccelerated="true" <-- 为什么,因为它有很多副作用(我仍然使用了这个,但我在这个问题上没有发现任何变化).

I can't make android:hardwareAccelerated="true" <-- why because it has lot of side effects (Still I used this one, but no changes I found on this issue).

我不能用webview.getSettings().setRenderPriority(RenderPriority.HIGH);

setRenderPriority() --> 此方法在 API 级别 18 中已弃用.不建议调整线程优先级,后续版本不支持.

setRenderPriority() --> This method was deprecated in API level 18. It is not recommended to adjust thread priorities, and this will not be supported in future versions.

我的 DataLoader.java 类

My DataLoader.java class

public class DataLoader extends Activity {

    private WebView webView = null;
    // Progress Dialog
    private ProgressDialog progressDialog;

    String dataContent = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.web_view);
        webView = (WebView)findViewById(R.id.text);

        // Loading webview in Background Thread
        new LoadWebView().execute();
    }

    class LoadWebView extends AsyncTask<String, String, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog = new ProgressDialog(DataLoader.this);
            progressDialog.setTitle("Loading...");
            progressDialog.setMessage("Please wait.");
            progressDialog.setCancelable(false);
            progressDialog.setIndeterminate(true);
            progressDialog.show();
        }

        protected String doInBackground(String... args) {
            // AssetFileReader read the txt file and return data in the form of string
            dataContent = AssetFileReader.read(getApplicationContext(), "test.txt");

            return null;
        }

        protected void onPostExecute(String str) {
            // dismiss the dialog
            progressDialog.dismiss();

            if (dataContent != null) {
                // updating UI from Background Thread
                runOnUiThread(new Runnable() {
                    public void run() {

                        WebSettings s = webView.getSettings();
                        s.setUseWideViewPort(true);
                        s.setSupportZoom(true);
                        s.setBuiltInZoomControls(true);
                        s.setDisplayZoomControls(false);
                        s.setJavaScriptEnabled(true);
                        webView.loadData(dataContent, "text/html", "utf-8");
                    }
                });
            }
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        webView.clearCache(true);
        webView.clearHistory();
    }
}

我的 web_view.xml 文件

my web_view.xml file

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <WebView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/text">
    </WebView>

</LinearLayout>

如果您对此问题有任何解决办法,请告诉我.

please let me know if you have any work around on this issue.

推荐答案

我认为以下最有效:

if (Build.VERSION.SDK_INT >= 19) {
    webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
}       
else {
    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

Android 19 具有用于 WebView 的 Chromium 引擎.我想它在硬件加速下效果更好.

Android 19 has Chromium engine for WebView. I guess it works better with hardware acceleration.

欲了解更多信息 Android 4.4 KitKat,浏览器和 Chrome WebView

For more info Android 4.4 KitKat, the browser and the Chrome WebView

硬件加速也很重要.你可以使用它在您的应用程序中处于不同级别.

Hardware Acceleration also do's the trick.You can use it in different levels in your application.

应用层

<application android:hardwareAccelerated="true" ...>

活动水平

<application android:hardwareAccelerated="true">
    <activity ... />
    <activity android:hardwareAccelerated="false" />
</application>

窗口级别

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

视图级别

myView.setLayerType(View.LAYER_TYPE_HARDWARE, null);

但是正如您在问题中已经提到的,您能否详细说明此副作用?

But as already mentioned in your question can you elaborate the side effects for this ?

这篇关于Android webview加载数据性能很慢的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆