Java 在PreferenceActivity中显示ProgressDialog

Java 在PreferenceActivity中显示ProgressDialog,java,android,progressdialog,preferenceactivity,Java,Android,Progressdialog,Preferenceactivity,当我试图在onPreferenceChange侦听器中显示ProgressDialog(简单的微调器类型)时,我遇到了一个非常有趣的问题 public class SettingsActivity extends PreferenceActivity { private ProgressDialog dialog; public void onCreate(Bundle savedInstanceState) { ListPreference pref= (ListPrefer

当我试图在
onPreferenceChange
侦听器中显示
ProgressDialog
(简单的微调器类型)时,我遇到了一个非常有趣的问题

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
)完成。我做错了什么?

您睡在主UI线程上,这会阻止操作系统处理应用程序的事件。这将阻止你的应用程序重新绘制,正如你所发现的,可以阻止新窗口实际出现

不要睡觉,试试以下方法:

final ProgressDialog dialog = ProgressDialog.show(
    SettingsActivity.this, "", "Doing stuff...", true);
new Handler().postDelayed(new Runnable() {
    public void run() {
      dialog.hide();
    }
  }, 2000);

您可以使用
AsyncTask
在单独的线程中运行函数(请参阅)

如果您只想调用
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();
    }
 }

谢谢你告诉我问题是什么,因为我认为这与PreferenceActivity有关(因为我的任何其他活动中都没有出现过这个问题)。但是,因为我希望将来能够调用sleep()以外的其他方法,所以这不是一个很好的解决方案(即使如果不是这样,它可能是最好的解决方案)。
new BackgroundTask().execute(2000);