【问题标题】:Android: Heavy DB operations with progress dialogAndroid:带有进度对话框的繁重数据库操作
【发布时间】:2012-03-08 19:16:19
【问题描述】:

我已经习惯了 following AsyncTask 的 doInBackground 方法上的习惯用法,以便快速插入数据库:

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

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

但是,如果我使用这个成语,我的进度对话框(放在onPreExecute 方法中)不会显示。另一方面,如果我用常规的 mDatabase.execSQL() 语句替换上面的代码,进度对话框确实会显示,但插入变得非常慢。有什么办法可以让我两全其美(即进度对话框和快速插入)。谢谢!

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

【问题讨论】:

  • 您的进度对话框是否显示在 PreExecute() 中并隐藏在 PostExecute() 中?
  • 是的。如果我使用 SQLiteDatabase.execSQL 而不是上述成语进行插入,它工作正常。然而,这些都非常缓慢,所以我几乎坚持使用上述成语......
  • 您是否尝试过在 AsyncTask 之外保留对 ProgressDialog 的引用以自己显示/隐藏它?这就是我会尝试的。

标签: java android database


【解决方案1】:

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

【讨论】:

  • 谢谢。但这也不起作用。只有在所有插入发生后才会显示进度对话框。您认为这是因为 beginTransaction 习语而发生的吗?如果我使用常规 sql 语句插入,一切正常..
  • 如果你把它放在你的 onCreate 中,它很可能被 beginTransaction() 调用 onCreate 完成之前锁定。
【解决方案2】:

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

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

如果我将 ProgressDialog.show 下面的代码移动到 doInBackground 之前的 beginTransaction 习语,则显示对话框。我仍然不明白为什么会发生这种情况,但确实如此。感谢您的所有帮助。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,我想我可以解释发生了什么(就我而言)。

    beginTransaction() 会锁定您的数据库,因此如果您放入数据库的上下文是您的活动,它也会锁定您的活动,无法完成您的 onCreate(因此,不允许显示您的进度对话框)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 2011-07-27
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多