web-dev-qa-db-ja.com

asynctaskを使用して、カウントダウンするプログレスバーを表示するにはどうすればよいですか?

私のアプリケーションでは、ユーザーがボタンを押してから5分間待つようにします。私はこれがひどいように聞こえることを知っていますが、それと一緒に行ってください。 5分間の待機時間の残り時間がプログレスバーに表示されます。

私はカウントダウンにテキストビューでCountDownTimerを使用していましたが、上司はもっと見栄えの良いものを望んでいます。したがって、プログレスバーの理由。

7
wyatt

あなたはこのようなことをすることができます。

public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
private ProgressDialog mProgressDialog;

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case DIALOG_DOWNLOAD_PROGRESS:
        mProgressDialog = new ProgressDialog(this);
        mProgressDialog.setMessage("waiting 5 minutes..");
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mProgressDialog.setCancelable(false);
        mProgressDialog.show();
        return mProgressDialog;
    default:
    return null;
    }
}

次に、非同期タスクを記述して進行状況を更新します。

private class DownloadZipFileTask extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        showDialog(DIALOG_DOWNLOAD_PROGRESS);
    }

    @Override
    protected String doInBackground(String... urls) {
        //Copy you logic to calculate progress and call
        publishProgress("" + progress);
    }

    protected void onProgressUpdate(String... progress) {        
    mProgressDialog.setProgress(Integer.parseInt(progress[0]));
    }

    @Override
    protected void onPostExecute(String result) {           
        dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
    }
}

これはあなたの目的を解決するはずであり、UIトレッドをブロックすることさえありません。

35
Sushil