Подтвердить что ты не робот

Android-просмотр загружаемых данных Android очень медленный

Привет, я работаю над одним приложением. В этом я использую Android WebView. Всякий раз, когда я запускаю активность веб-просмотра, загружаю данные в строковый html-формат из файла test.txt. Файл test.txt содержит почти 2,5 МБ данных после загрузки файла test.txt, если слайд-экран заканчивается, чтобы прочитать все данные и нажать. Затем последующий запуск активности веб-просмотра занимает больше времени для обработки данных. При первом запуске webview он занимает минимальное время. Я не получаю никаких ошибок/исключений/сбоев между запуском этого действия.

Я использую Android API уровня 18 и выше

Примечание: Я много исследовал эту проблему. Я пробовал решение из Android-браузера в режиме паутины и производительность Android WebView без использования.

Я не могу сделать андроид: hardwareAccelerated = "true" < - почему, поскольку он имеет множество побочных эффектов (все же я использовал этот, но никаких изменений, которые я нашел по этой проблеме),

Я не могу использовать webview.getSettings() setRenderPriority (RenderPriority.HIGH);.

setRenderPriority() → Этот метод устарел на уровне API 18.                       Не рекомендуется настраивать приоритеты потоков, и это не будет поддерживаться в будущих версиях.

Мой класс DataLoader.java

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

<?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>

пожалуйста, дайте мне знать, если у вас есть какие-либо проблемы по этой проблеме.

4b9b3361

Ответ 1

Я думаю, что лучше всего работает следующее:

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

Android 19 имеет движок Chromium для WebView. Я думаю, что он работает лучше с аппаратным ускорением.

Для получения дополнительной информации Android 4.4 KitKat, браузер и веб-браузер Chrome

Hardware Acceleration также выполняет трюк. Вы можете использовать его на разных уровнях в своем приложении.

Уровень приложения

<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_SOFTWARE, null);

Но как уже упоминалось в вашем вопросе, вы можете уточнить для этого побочные эффекты?

Ответ 2

Я пробовал ниже код, который работает быстрее для меня

// For API level below 18 (This method was deprecated in API level 18)
webview.getSettings().setRenderPriority(RenderPriority.HIGH); 

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

Ответ 3

В случае, если кто-то попадает сюда, все еще бьют головы против стены, пытаясь сделать WebViews быстрее, попробуйте Crosswalk XWalkView. Сделал огромную разницу в нашем приложении.