アプリの SQLite データベースのさまざまなテーブルへの多数のレコードの定期的な挿入 (更新の公開後) を非表示にするために、アプリのスプラッシュ スクリーンを作成しました。UI スレッドからの挿入を処理するために AsyncTask を実装しています。
挿入操作の現在の進行状況のパーセンテージをユーザーに通知するには、ProgressDialog (単純な回転ホイールではなく、進行状況バーを使用) を作成する必要があります。
ダイアログの進行状況バーを設定するほとんどの例では、時間のかかる操作を表す for ループのカウンター変数、またはファイル ダウンロードのパーセンテージを使用して、ダイアログの進行状況を設定します。ただし、異なるテーブルへの挿入には異なる時間がかかる場合があるため (列の数などによって)、このアプローチは失敗するようです。私が見ることができる最も近い解決策は、publishProgress() のパラメーターとして挿入されたレコードの % を使用して、doInBackground() メソッドにレコードを挿入するたびに publishProgress(some_percentage) 行を記述することですが、これは非常に洗練されておらず、非効率的です。練習。
私の 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) {
}
}