2

完了するまでに時間がかかる可能性のあるサービスを呼び出すアクティビティがあり、そのサービスが終了しないまで、クリックされたメニュー オプションは「データの準備ができていません。すぐに再試行してください」などのエラー メッセージを返す必要があります。 、そのエラーをスローする前に終了するまで数秒待ちたいと思います。その間、画面に進行状況ダイアログを表示したいと思います。ここに私が持っているコードがあります:

if(calculatedValue.equals(NOT_YET_CALCULATED)){
                //show progress dialog
                ProgressDialog progress = ProgressDialog.show(this, "", getResources().getString(R.string.wait), true);
                long timeStarted = System.currentTimeMillis();
                while(calculatedValue.equals(NOT_YET_CALCULATED) && System.currentTimeMillis() - timeStarted < 1500){
                    // wait for at most 1.5 seconds
                }
                progress.dismiss();
                if(calculatedValue.equals(NOT_YET_CALCULATED)){
                    //if it's still not there, there's probably a problem, show generic alert dialog
                    AlertDialog dialog = new AlertDialog.Builder(this).create();
                    dialog.setTitle(R.string.not_yet_calulated_alert_title);
                    dialog.setMessage(getResources().getString(R.string.not_yet_calulated_alert_message));
                    dialog.show();
                }else{
                    startActivity(j);
                }
            }else{
                startActivity(j);
            }

説明させてください: 値が存在するかどうかを確認し、存在しない場合は、1.5 秒間、進行状況アイコン (円を選択します) を表示します。その後もまだ表示されない場合は、あきらめてエラー メッセージを表示します。

問題は、進行状況が画面に表示されないことです。私は何を間違っていますか?

ありがとう、e。

4

2 に答える 2

2

これには非同期タスクを使用する必要があります。コードは次のとおりです。

    if(calculatedValue.equals(NOT_YET_CALCULATED)){
    //show progress dialog
    final ProgressDialog progress = ProgressDialog.show(this, "", getResources().getString(R.string.wait), true);
    AsyncTask<Void, Void, Boolean> waitForCompletion = new AsyncTask<Void, Void, Boolean>(){
        @Override
        protected Boolean doInBackground(Void... params) {
            long timeStarted = System.currentTimeMillis();
            while(calculatedValue.equals(NOT_YET_CALCULATED) && System.currentTimeMillis() - timeStarted < 1500){
                // wait for 1.5 ms
                 try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        Log.e(TAG, "thread interrupted", e);
                    }
            }
            progress.dismiss();
            return calculatedValue.equals(NOT_YET_CALCULATED);
        };
        @Override
        protected void onPostExecute(Boolean result) {
        if(result == true){
            AlertDialog dialog = new AlertDialog.Builder(TodayActivity.this).create();
            dialog.setTitle(R.string.not_yet_calulated_alert_title);
            dialog.setMessage(getResources().getString(R.string.not_yet_calulated_alert_message));
            dialog.show();
        }else{
            i.putExtra(Constants.AMOUNT, Integer.parseInt(calculatedValue));
            startActivity(i);
        }
        }
    };
    waitForCompletion.execute(null, null, null);
}else{
i.putExtra(Constants.AMOUNT, Integer.parseInt(calculatedValue));
startActivity(i);
}
于 2011-05-05T15:25:41.213 に答える
0

あなたが今作っているものは、少なくともデッドロックを引き起こします。

私が通常行うことは、現在行っているようにプログレスダイアログを作成し、同時にこの状況で1.5秒間待機してプログレスダイアログを停止する別のスレッドを開始することです。

例えば

    private Runnable waitforcompletion = new Runnable()
{
    @Override
    public void run()
    {
         while(calculatedValue.equals(NOT_YET_CALCULATED) && System.currentTimeMillis() - timeStarted < 1500){
                Thread.sleep(10);
                }

                progress.dismiss(); 
    }
};

そして、開始するには、progressdialog を作成した後に上記のランナブルを呼び出すだけです

于 2011-05-03T16:44:31.583 に答える