0

アプリの 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) {
    }

}
4

1 に答える 1

1

残念ながら、コード行をプログラムで数え、実行に必要な時間を計算し、時間に比例した正確な進行状況を生成する方法はありません。

90 回の挿入 (10%) ごとなど、一定の間隔の行の後、プログレス バーを更新することをお勧めします。

または、現在行っている作業に応じて更新し、進行状況メッセージを変更します (創造的になるようにしてください)。たとえば、「ユーザーを追加しています」、「死の光線を生成しています」、「宇宙を作成しています」、「あと少し」などです。

于 2012-08-19T21:44:29.143 に答える