2

アプリにボタンがあり、ユーザーがクリックすると、onResume() を呼び出して現在のページが更新され、onResume() には多くのデータベース操作があります。ボタンをしばらく押したままにする代わりに、asynctask を使用して、データの読み込み中に進行状況ダイアログを作成したいと思います。しかし問題は、ボタンがまだ押された状態のままであり、進行状況ダイアログが操作の最後に非常に短い時間しか表示されないことです。

RefreshButton.setOnClickListener(new OnClickListener()
        {

            public void onClick(View v)
            {
                onResume();
            }
        });

protected void onResume()
    {
        doneloading = false;
        monResumeloading = new onResumeloading();
        monResumeloading.execute();
        ....loading...

            doneloading = true;
    }

private class onResumeloading extends AsyncTask<Integer, Integer, String>
    {
        private ProgressDialog progressDialog;
        @Override
        protected void onPostExecute(String result)
        {
            progressDialog.dismiss();
        }

        @Override
        protected void onPreExecute()
        {
            progressDialog = new ProgressDialog(StatisticsActivity.this);
            progressDialog.setMessage("Loading...");
            progressDialog.setCancelable(true);
            progressDialog.show();

            Log.i(TAG, "              doneloading=false");
        }

        @Override
        protected void onProgressUpdate(Integer... values)
        {

        }

        @Override
        protected String doInBackground(Integer... params)
        {
            while(!doneloading)
            {
                publishProgress(0);   //dummy
                            log.i(TAG, "loading");
            }
            return null;
        }


    }

asynctask の実行直後に「読み込み中」のログが表示され、ブール値の doneloading が false になった直後に停止することがわかりました。しかし、進行状況ダイアログが正しく機能していません。私を助けてください :(

4

1 に答える 1

2

まず、 onResume() 関数で AsyncTask を呼び出す必要はないと思います。ClickListener から簡単に呼び出すことができます。

現在、AsyncTask を実行する前に、'....loading...' コードを実行しています。そのため、「....loading...」の実行中にボタンが押されたままになり、完了すると、実際には何もしていない AsyncTask が実行されます。そのため、短時間だけ表示されます。

「....loading...」コードを AsyncTask の doInBackground() に移動すると、問題なく動作するはずです。

概要:

  1. クリック: AsyncTask の実行
  2. AsyncTask: ProgressDialog を開きます
  3. AsyncTask: '...loading...' コードを実行します
  4. AsyncTask: ダイアログを表示したまま、'...loading...' コードが完了するのを待ちます。
  5. AsyncTask: ProgressDialog を閉じる
于 2012-09-27T00:45:02.057 に答える