Android:具有进度对话框的重型DB操作

时间:2012-03-08 19:16:20

标签: java android database

我习惯使用following惯用法在AsyncTask的doInBackground方法上快速插入数据库:

    mDatabase.beginTransaction();
    try {
            //... do DB stuff

            mDatabase.setTransactionSuccessful();
    } finally {
            mDatabase.endTransaction();
    }

但是,如果我使用这个习惯用法,则不会显示我的进度对话框(放在onPreExecute方法中)。另一方面,如果我用常规mDatabase.execSQL()语句替换上面的代码,则会显示进度对话框,但插入变得非常慢。有什么方法可以让两个世界都做到最好(即进度对话和快速插入)。谢谢!

注意:beginTransaction在EXCLUSIVE模式下运行(我不知道这意味着什么)。这是原因吗?

3 个答案:

答案 0 :(得分:0)

在开始AsyncTask之前显示您的对话框(例如,通过showDialog())。

答案 1 :(得分:0)

我找到了答案。显然,这是我在doInBackground之前做的事情,这就是问题所在。我定义了以下内容:

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        mProgD = ProgressDialog.show(mContext, "", "Wait", true);
        ih = new InsertHelper(mDatabase, "dictionary");
        wordColumn = ih.getColumnIndex("word");
    }

如果我在beginTransaction惯用法之前将ProgressDialog.show下面的代码移动到doInBackground中,则会显示该对话框。我仍然不明白为什么会发生这种情况,但确实如此。谢谢你的帮助。

答案 2 :(得分:0)

我遇到了同样的问题,我想我可以解释发生了什么(在我的情况下)。

beginTransaction()会锁定您的数据库,因此如果您放入数据库的上下文是您的活动,它还会锁定您的活动以完成onCreate(因此,不允许您显示progressdialog)。

我程序的简单修复是让线程休眠几百毫秒,然后在progressdialog初始化后通过beginTransaction()锁定数据库/活动。