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 回答