6

アクティビティを開く際の進行状況ダイアログに問題があります (例ではアクティビティ 2 と呼ばれます)。

アクティビティ 2 には、この OnCreate イベントで実行するコードがたくさんあります。

final ProgressDialog myProgressDialog = ProgressDialog.show(MyApp.this,getString(R.string.lstAppWait), getString(R.string.lstAppLoading), true);
new Thread() {
    public void run() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                showApps();
            }
        });
        myProgressDialog.dismiss();
    }
}.start(); 

showApps 関数の起動アクティビティ 2.

アクティビティ1のボタンクリックイベントでこのコードを実行すると、進行状況が表示されますが、彼女は動かず、Androidがアクティビティを表示する2〜3秒間黒い画面が表示されます。

このコードを Activity2 の OnCreate で実行し、showApps を OnCreate のコードに置き換えると、Activity1 が 2 秒間フリーズすると、進行状況ダイアログが表示されず、アクティビティ 2 で再び 2 秒間フリーズしてから結果が表示されます。

4

4 に答える 4

10

同じ問題があり、AsyncTaskを使用するとうまくいきます。

AsyncTask でオーバーライドする重要なメソッドが 3 つあります。

  1. doInBackground : これは、バックグラウンド処理の要となる場所です。
  2. onPreExecute : ここに ProgressDialog を表示します ( showDialog )
  3. onPostExecute : ここで ProgressDialog を非表示にします ( removeDialog または disconnectDialog )

AsyncTask サブクラスをアクティビティの内部クラスとして作成すると、フレームワーク メソッドの showDialog、dismissDialog、removeDialog を AsyncActivity 内から呼び出すことができます。

AsyncTask の実装例を次に示します。

class LoginProgressTask extends AsyncTask<String, Integer, Boolean> {
  @Override
  protected Boolean doInBackground(String... params) {
    try {
      Thread.sleep(4000);  // Do your real work here
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return Boolean.TRUE;   // Return your real result here
  }
  @Override
  protected void onPreExecute() {
    showDialog(AUTHORIZING_DIALOG);
  }
  @Override
  protected void onPostExecute(Boolean result) {
    // result is the value returned from doInBackground
    removeDialog(AUTHORIZING_DIALOG);
    Intent i = new Intent(HelloAndroid.this, LandingActivity.class);
    startActivity(i);
  }
}
于 2011-01-11T00:49:12.407 に答える
3

私の知る限り、進行状況ダイアログが表示された状態でアクティビティをプリロードすることはできません。実際のデバイスまたはエミュレーターでテストしていますか?

進行状況のアニメーションが中央にある ViewFlipper を使用してアクティビティを開く回避策を見てきました。次のビューでは、アクティビティが読み込まれましたが、推奨されるものではなく、希望どおりに動作するように実装するのは困難です。

于 2010-11-23T09:18:58.067 に答える
3

ジーザ

アクティビティ 2 の OnCreate で多くの操作を実行しないようにすることをお勧めします。OnCreate で多くの操作を書き込むと、アクティビティ間の黒い画面が表示されます。したがって、 AsyncTaskを使用して、または Thread でこれらの操作を非同期的に実行します (または、onStartに書き込む場合は、それらの操作を実行します)。不可避です)。

もう 1 つの提案は、アクティビティ 2 の onCreate で別の progressDialog を開始することです。これは、すべてのデータが読み込まれるまで実行され、バックグラウンドで何かが起こっていることがユーザーにわかります。

于 2010-11-23T12:21:29.690 に答える
0

これが私がすることです。UI スレッドでハンドラーを作成し、バックグラウンド処理スレッドを開始してから、進行状況ダイアログを表示します。バックグラウンド スレッドが終了したら、ハンドラーを介して ui スレッドに runnable をポストし、ダイアログを閉じます。

于 2010-11-23T12:36:13.257 に答える