9

Android アプリで数秒待たなければならず、その間進行状況バーを表示したいのですが、どうすればよいですか?

たとえば、このコードを試しました:

    public boolean WaitTask() {

        pDialog = ProgressDialog.show(context,null, "Lädt..",true);
        new Thread() {
        public void run() {
            try{
                // just doing some long operation
                sleep(2000);
             } catch (Exception e) {  }
             pDialog.dismiss();
             }
         }.start();
        return true;
   }

ただし、プログレスバーは 2 秒待たずにすぐに閉じます。私の問題はどこですか?

プログレスバーは、Android Developersのこのサイトに表示されているアクティビティ サークルのように見えるはずです。

AsyncTask の更新

private class WaitTime extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        mDialog.show();
    }
    protected void onPostExecute() {
        mDialog.dismiss();
    }

@Override
protected void onCancelled() {
    mDialog.dismiss();
    super.onCancelled();
}

    @Override
    protected Void doInBackground(Void... params) {
        long delayInMillis = 2000;
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                mDialog.dismiss();
            }
        }, delayInMillis);
        return null;
    }
}

私はそれを次のように呼びます:

        mDialog = new ProgressDialog(CreateProject.this);
        mDialog = ProgressDialog.show(context,null, "Lädt..",true);

        WaitTime wait = new WaitTime();
        wait.execute();
4

2 に答える 2

9

AsyncTaskを使用することをお勧めします。そうすれば、次のようなことができます。

    AsyncTask<Void, Void, Void> updateTask = new AsyncTask<Void, Void, Void>(){
        ProgressDialog dialog = new ProgressDialog(MyActivity.this);
        @Override
        protected void onPreExecute() {
            // what to do before background task
            dialog.setTitle("Loading...");
            dialog.setMessage("Please wait.");
            dialog.setIndeterminate(true);
            dialog.setCancelable(false);
            dialog.show();
        }

        @Override
        protected Void doInBackground(Void... params) {
            // do your background operation here
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // what to do when background task is completed
            dialog.dismiss();
        };

        @Override
        protected void onCancelled() {
            dialog.dismiss();
            super.onCancelled();
        }
    };
    updateTask.execute((Void[])null);

また、特定の時間を待ちたい場合は、タイマーを使用することをお勧めします。

    final ProgressDialog dialog = new ProgressDialog(MyActivity.this);
    dialog.setTitle("Loading...");
    dialog.setMessage("Please wait.");
    dialog.setIndeterminate(true);
    dialog.setCancelable(false);
    dialog.show();

    long delayInMillis = 5000;
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            dialog.dismiss();
        }
    }, delayInMillis);
于 2012-10-02T14:02:51.837 に答える
6

間違い:pDialog.dismiss();新しいスレッドから呼び出すのではなく、UI スレッドから呼び出す必要があります。

したがって、コードは次のように変更する必要があります。

pDialog = ProgressDialog.show(context,null, "Lädt..",true);
    new Thread() {
    public void run() {
        try{
            // just doing some long operation
            Thread.sleep(2000);
         } catch (Exception e) {  }
           // handle the exception somehow, or do nothing
         }

         // run code on the UI thread
         mYourActivityContext.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                pDialog.dismiss();
            }
        });

     }.start();

一般に、バックグラウンド タスクを実行し (待機して 2 秒間何もしないこともバックグラウンド タスクです)、終了時にメイン UI スレッドで何かを実行する、はるかに優れた方法があります。AsyncTaskたとえば、クラスを使用できます。アプリケーションとアクティビティのライフサイクルを正しく処理する場合にのみ機能しますが、「プリミティブ」スレッド作成ではなく、この Android 組み込みメカニズムを使用することをお勧めします。待機している 2 秒間に、ユーザーがアプリケーションから離れてしまう可能性があることに注意してください。その場合、dismiss();メソッドは破棄されたコンテキストで呼び出されます...

詳細を読むことをお勧めします - http://developer.android.com/reference/android/os/AsyncTask.html

于 2012-10-02T14:00:44.520 に答える