【问题标题】:Displaying a progress dialog when upgrading database升级数据库时显示进度对话框
【发布时间】:2011-06-09 14:16:30
【问题描述】:

我的应用程序的下一个版本需要升级数据库,这需要相当长的时间。我想显示一个progressDialog 来更新用户的进度。问题是,我不太清楚如何以及在哪里创建对话框。

我的基本设置是我有一个本质上是闪屏的活动。我想在这个屏幕上显示进度。我有一个单独的 DbAdapter.java 文件,其中 DatabaseHelper 类扩展了 SQLiteOpenHelper,我在其中覆盖了 onUpgrade(升级部分工作正常)。

我尝试了几个不同的地方来实现进度对话框,但我似乎没有找到合适的位置。我尝试将初始屏幕活动中的上下文传递给 onUpgrade,但是当 onUpgrade 运行时,它似乎是从我的 ContentProvider 获取上下文。

有没有人有一个关于如何在升级数据库时显示进度对话框的好例子?

【问题讨论】:

  • 如果你能提供一些代码来准确显示你在做什么,那将会很有帮助。

标签: android database progressdialog


【解决方案1】:

您需要实现AsyncTask。示例:

class YourAsyncTask extends AsyncTask<Void, Void, Void> {

    private ProgressDialog progressDialog;

    @Override
    protected void onPreExecute() {
        //show your dialog here
        progressDialog = ProgressDialog.show(this, "title", "message", true, false)
    }

    @Override
    protected Void doInBackground(Void... params) {        
        //update your DB - it will run in a different thread
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        //hide your dialog here
        progressDialog.dismiss();
    }
}

那你只需要打电话

new YourAsyncTask().execute();

您可以在此处阅读有关 AsyncTask 的更多信息:http://developer.android.com/reference/android/os/AsyncTask.html

【讨论】:

  • 我实际上在使用 AsyncTask,从我的 DatabaseHelper 中的 onUpgrade 调用,但没有在其中创建 ProgressDialog。我尝试使用上面的代码实现它,但使用 ProgressDialog.show 得到此错误:ProgressDialog 类型中的方法 show(Context, CharSequence, CharSequence, boolean, boolean) 不适用于参数 (SpellDbAdapter.DatabaseHelper.upgradeTask,字符串,字符串,布尔值,布尔值)知道我做错了什么吗?
  • 再研究一下,我认为问题是我必须使用 Activity 上下文创建对话框,在我的情况下是启动屏幕活动,所以使用“this”不起作用。那么......我该怎么做呢?如何从 SQLiteOpenHelper 调用的 onUpgrade 获取该活动?
  • @anakin78z 如果您的 Activity 被称为 XPTO 而不是在 AsyncTask 中传递“this”,则改为传递“XPTO.this”
  • 不起作用。我认为问题在于 contentprovider 是在执行 onUpgrade 时打开数据库的上下文。由于它不是一个活动,因此上下文不允许对话。
  • 我确实需要这个,很高兴我遇到了这个线程。按照@pandre 建议的方法,我能够让它工作,并进行一些调整和改进。我能够使用传递给我的 SQLiteOpenHelper 的上下文,但是,它来自我的 Activity。如果您要使用 Content Provider 中的 Context 并调用 ProgressDialog.show(cpContext.getApplicationContext(), .....); 它对您有用吗? ?如果您愿意,我可以发布我的工作代码作为答案。
【解决方案2】:
ProgressDialog myProgressDialog = null;
public void DownloadFiles() {
        myProgressDialog = ProgressDialog.show(this, "Please wait !",
                "Updating...", true);
        new Thread() {
            public void run() {
                try {
                       //Your upgrade method !
                       YourUpdateFunction();
                } catch (Exception e) {
                    Log.v(TAG, "Error");
                }
                myProgressDialog.dismiss();
            }
        }.start();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多