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