为SQLite设置AsyncTask进度 - 无法获得进度百分比

时间:2012-08-19 21:22:39

标签: android sqlite android-asynctask

我为我的应用创建了一个启动画面,以隐藏大量记录的定期插入(在发布更新之后)到我的应用程序的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) {
    }

}

1 个答案:

答案 0 :(得分:1)

不幸的是,没有办法以编程方式计算代码行数,计算执行所需的时间并生成准确的时间比例进度。

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

或根据您正在做的事情进行更新并修改进度消息(尝试创造性),例如“添加用户”,“生成死亡射线”,“创建宇宙”,“再长一点”等等。