升级数据库时显示进度对话框

3
我的应用程序的下一个版本需要升级数据库,这需要相当长的时间。我想显示一个进度对话框来更新用户进展情况。问题是,我无法确定在哪里创建对话框。
我的基本设置是,我有一个活动,它本质上是一个启动屏幕。我想在这个屏幕上显示进度。我有一个单独的DbAdapter.java文件,在其中DatabaseHelper类扩展了SQLiteOpenHelper,我覆盖了onUpgrade(升级部分工作正常)。
我尝试了几个不同的地方来实现进度对话框,但似乎找不到正确的位置。我尝试从我的启动屏幕活动传递上下文到onUpgrade,但当onUpgrade运行时,它似乎从我的ContentProvider获取上下文。
是否有人有如何在升级数据库时显示进度对话框的好例子?

如果您能提供一些代码,准确地展示您正在做什么,那将非常有帮助。 - Nathan Fig
2个回答

3

您需要实现一个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


1
我实际上正在使用AsyncTask,在我的DatabaseHelper中从onUpgrade调用,但没有在其中创建ProgressDialog。我尝试使用您上面的代码来实现它,但是使用ProgressDialog.show时出现以下错误:ProgressDialog中的show(Context、CharSequence、CharSequence、boolean、boolean)方法不适用于参数(SpellDbAdapter.DatabaseHelper.upgradeTask、String、String、boolean、boolean)您有什么想法我做错了什么吗? - Jens Zalzala
进一步研究后,我认为问题在于我必须使用Activity上下文来创建对话框,在我的情况下是启动屏幕活动,因此使用“this”无法工作。那么...我该怎么办?如何从由SQLiteOpenHelper调用的onUpgrade中获取该活动? - Jens Zalzala
@anakin78z 如果您的Activity名称为XPTO,那么在AsyncTask中不要传递"this",而应该传递"XPTO.this"。 - pandre
不起作用。我认为问题在于ContentProvider是上下文,当它执行onUpgrade时打开数据库。由于它不是活动,上下文不允许对话框。 - Jens Zalzala
我正好需要这个,很高兴遇到了这个帖子。我按照@pandre建议的方法进行了一些调整和改进,最终使它工作了。我能够使用传递给我的SQLiteOpenHelper的Context,但是它来自于我的Activity。如果您使用Content Provider的Context并调用ProgressDialog.show(cpContext.getApplicationContext(),.....),那么它是否适用于您呢?如果您愿意,我可以将我的可行代码发布为答案。 - hooked82

0
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();
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接