Мгновенно откройте диалог, а затем загрузите содержимое для диалога - PullRequest
0 голосов
/ 21 октября 2018

Сценарий: В моем приложении, когда я нажимаю на кнопку, оно открывает диалог с WebView, загружает некоторые данные (что включает в себя копирование, редактирование и загрузку файла HTML локально).Ожидается, что в WebView будет отображаться HTML-файл, созданный локально.

Что происходит: Открытие диалогового окна занимает много времени.Он ждет хотя бы части копирования и редактирования файла.Диалог открывается, когда WebView начинает загружать файл HTML.

Что я пробовал: Я пытался вызвать их в основном потоке:

url = prepareLocalHtmlFile(dataKey); //Copy and edit html file and returns its path in local dir
webView.loadUrl(url); //Show the html file in WebView

Также пробовал в отдельном потоке:

Thread mThread = new Thread() {
    @Override
    public void run() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                url = prepareLocalHtmlFile(dataKey); //Copy and edit html file and returns its path in local dir
                webView.loadUrl(url); //Show the html file in WebView
            }
        });
    }
};
mThread.start();

Что я хочу: Диалог должен открыться сразу же, как только я нажму кнопку, и тогда должны произойти все трудоемкие операции (копирование, редактирование, загрузка HTML в webView).Подскажите пожалуйста как этого добиться.

1 Ответ

0 голосов
/ 26 октября 2018

Попробовав немного больше, я наконец нашел решение.Используйте AsyncTask.

Я создал класс, который расширяет AsyncTask.

public class GenerateDataToDisplay extends AsyncTask<String, Integer, Boolean> {
    private Context context;
    private SQLiteDatabase appDb;

    public GenerateDataToDisplay(Context context, SQLiteDatabase appDb){
        this.context = context;
        this.appDb = appDb;
    }

    @Override
    protected Boolean doInBackground(String[] results) {
        return results.length > 0 && generateDataToDisplay(context, appDb, results[0]);
    }
}

Затем выполните это AsyncTask в диалоге вызова, как показано ниже:

new GenerateDataToDisplay(this, db)
        {
            @Override
            public void onPostExecute(Boolean result) {
                //Hide progress bar
                progressBar.setVisibility(View.GONE);
                //Display data
                textView.setText("Got it!!!"); 
            }
        }.execute(inputKey);

В этой реализации диалоговое окно открывается немедленно, отображается индикатор выполнения, начинается загрузка данных (AsyncTask).когда данные готовы, индикатор выполнения исчезает и данные отображаются.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...