首页 > 解决方案 > 立即打开对话框,然后为对话框加载内容

问题描述

场景:在我的应用程序中,当我单击按钮时,它会打开带有 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();

我想要什么:一旦我按下按钮,对话框应该立即打开,然后所有耗时的操作都应该发生(复制、编辑、在 webView 中加载 HTML)。请建议如何实现它。

标签: androidandroid-asynctaskandroid-dialogandroid-runonuithreadandroid-thread

解决方案


在尝试了更多之后,我终于找到了解决方案。使用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)。当数据准备好时,进度条消失并显示数据。

到目前为止,它对我来说效果很好。如果您有更好的建议,请随时发表评论以添加另一个答案。


推荐阅读