4

リスナーProgressDialog内に(単純なスピナータイプ)を表示しようとすると、非常に興味深い問題が発生します。onPreferenceChange

public class SettingsActivity extends PreferenceActivity {
  private ProgressDialog dialog;

  public void onCreate(Bundle savedInstanceState) {
    ListPreference pref= (ListPreference) findPreference("myPreference");  
    pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

      @Override
      public boolean onPreferenceChange(Preference preference, Object newValue) {
        dialog = ProgressDialog.show(SettingsActivity.this, "", "Doing stuff...", true);
        SystemClock.sleep(2000);
     }
    return true;
  }
}

が表示されますが、メソッド(この場合)が終了ProgressDialogするまで表示されません。sleep私は何が間違っているのですか?

4

2 に答える 2

4

メインの UI スレッドでスリープしているため、オペレーティング システムがアプリケーションのイベントを処理できなくなります。これにより、アプリの再描画が停止し、発見したように、新しいウィンドウが実際に表示されなくなる可能性があります。

寝る代わりに、これを試してください:

final ProgressDialog dialog = ProgressDialog.show(
    SettingsActivity.this, "", "Doing stuff...", true);
new Handler().postDelayed(new Runnable() {
    public void run() {
      dialog.hide();
    }
  }, 2000);
于 2010-08-01T01:19:06.570 に答える
3

AsyncTask別のスレッドで関数を実行するために使用できます ( http://developer.android.com/resources/articles/painless-threading.htmlを参照)

メソッドを呼び出すだけの場合、これはおそらく少し不要ですがsleep、UI スレッドをブロックする他のメソッドでも機能するはずです。

次のようなことができます。

private class BackgroundTask extends AsyncTask<Integer, Integer, void> {
    private ProgressDialog dialog;

    @Override
    protected void onPreExecute() {
        dialog = ProgressDialog.show(SettingsActivity.this, "", "Doing stuff...", true);
    }

    @Override
    protected void doInBackground(Integer... params) {
        sleep(params[0]);
    }

    @Override
    protected void onPostExecute(Boolean result) {
        dialog.dismiss();
    }
 }

そして、以下のコードを使用して呼び出します。

new BackgroundTask().execute(2000);
于 2010-08-01T12:55:30.087 に答える