Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 正在为SQLite设置异步任务进度-无法获取进度百分比_Android_Sqlite_Android Asynctask - Fatal编程技术网

Android 正在为SQLite设置异步任务进度-无法获取进度百分比

Android 正在为SQLite设置异步任务进度-无法获取进度百分比,android,sqlite,android-asynctask,Android,Sqlite,Android Asynctask,我已经为我的应用程序创建了一个启动屏幕,用于将大量记录的定期插入(发布更新后)隐藏到我的应用程序的SQLite数据库的不同表中。我已经实现了一个AsyncTask来处理UI线程的插入 我需要创建一个ProgressDialog(带有进度条,而不是简单的旋转轮),以通知用户插入操作的当前进度百分比 在大多数设置对话框进度条的示例中,使用for循环的计数器变量(表示冗长操作)或文件下载的百分比来设置对话框的进度。然而,由于插入不同的表可能需要不同的时间(取决于列的数量等),这种方法似乎失败了。我能看

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

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

在大多数设置对话框进度条的示例中,使用for循环的计数器变量(表示冗长操作)或文件下载的百分比来设置对话框的进度。然而,由于插入不同的表可能需要不同的时间(取决于列的数量等),这种方法似乎失败了。我能看到的最接近的解决方案是,在我的doInBackground()方法中每次插入记录后,使用插入的记录的百分比作为publishProgress()的参数,写一行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) {
    }

}
私有类插入操作扩展了异步任务{
语境;
私人对话;
私有转发操作(上下文){
this.context=上下文;
dialog=新建进度对话框(上下文);
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
this.dialog.setMessage(“正在初始化数据库。请稍候…”);
this.dialog.show();
this.dialog.getWindow().setGravity(Gravity.BOTTOM);
this.dialog.setProgressStyle(ProgressDialog.STYLE_水平);
this.dialog.setCancelable(false);
}
@凌驾
受保护的Void doInBackground(Void…参数){
//大量的记录插入
返回null;
}
@凌驾
受保护的void onPostExecute(void避免){
super.onPostExecute(避免);
//转到主要活动
if(dialog.isShowing()){
dialog.dismise();
}
动画转换(飞溅显示时间/2);
}
@凌驾
受保护的void onProgressUpdate(整型…值){
}
}

不幸的是,无法通过编程方式计算代码行数,计算代码执行所需的时间,并生成与时间成比例的准确进度

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


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

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