【问题标题】:Setting AsyncTask progress for SQLite - cannot get progress percentage为 SQLite 设置 AsyncTask 进度 - 无法获得进度百分比
【发布时间】:2012-08-19 21:22:38
【问题描述】:

我为我的应用程序创建了一个启动屏幕,以隐藏将大量记录定期插入(在发布更新之后)到我的应用程序 SQLite 数据库的不同表中。我一直在实现一个 AsyncTask 来处理 UI 线程的插入。

我需要创建一个 ProgressDialog(带有进度条,而不是简单的转轮)来通知用户当前插入操作的进度百分比。

在大多数设置对话框进度条的示例中,for 循环的计数器变量表示冗长的操作,或者文件下载的百分比用于设置对话框的进度。但是,由于插入不同的表可能需要不同的时间(取决于列数等),这种方法似乎失败了。我能看到的最接近的解决方案是在我的 doInBackground() 方法中的每个记录插入之后编写一个 publishProgress(some_percentage) 行,使用插入的记录的百分比作为 publishProgress() 的参数,但这似乎非常不优雅和低效练习。

我的 AsyncTask 实现的当前代码如下。对于确定当前进度百分比的最佳实践的任何建议将不胜感激。谢谢!

private class InsertionAction extends AsyncTask<Void,Integer,Void> {

    Context context;
    private ProgressDialog dialog;

    private ForwardAction(Context context) {
        this.context = context;
        dialog = new ProgressDialog(context);

    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        this.dialog.setMessage("Initializing Database. Please Wait...");
        this.dialog.show();
        this.dialog.getWindow().setGravity(Gravity.BOTTOM);
        this.dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        this.dialog.setCancelable(false);
    }

    @Override
    protected Void doInBackground(Void... params) {

            // Large block of record insertions


        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);

        // Forward to the main activity
        if (dialog.isShowing()) {
            dialog.dismiss();
        }

        animatedTransition(SPLASH_DISPLAY_TIME/2);
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
    }

}

【问题讨论】:

  • “大块记录插入”是指大量的 java 代码行,还是有一些循环通过大量插入?
  • 行丢失。它目前大约有 900 行,并且随着我改进数据库而增长。
  • 您应该考虑更改更新模式,例如将所有更新放入包含原始 sql 命令的文本文件中,因此您只需逐行读取文件并执行命令。否则,您无能为力,只能在多个位置放置 publishProgress
  • @avoyles : 900 行 Java 代码来更新数据库……真的吗?当涉及到你的设计方法时,你做错了什么。
  • @Squonk :是的,我意识到这是一种糟糕的方法。数据库一直是我没有做太多改进的地方,因为有问题的表过去只包含约 40 条记录,每条记录都与特定的高尔夫球场有关。然而,随着我们支持的课程数量最近急剧增加,数据库中相应记录的数量也随之增加。我目前更新应用程序版本的方法(当添加新课程时)是删除该表,并将其重建为新版本,通过将所有这些记录添加到表中,因此插入许多记录的行数

标签: android sqlite android-asynctask


【解决方案1】:

遗憾的是,无法以编程方式计算代码行数、计算它们需要执行的时间并生成与时间成比例的准确进度。

我建议在一定的行间隔后更新进度条,例如每 90 次插入 (10%)。

或者根据你正在做的更新和修改进度信息(尽量有创意),例如“添加用户”、“产生死亡射线”、“创造宇宙”、“再长一点”等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多