在PreferenceActivity中显示ProgressDialog

时间:2010-08-01 00:43:06

标签: java android progressdialog preferenceactivity

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

2 个答案:

答案 0 :(得分:4)

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

不要睡觉,试试这个:

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

答案 1 :(得分: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);